什么是 Apex
Apex 是一种类似于 Java 的强类型、面向对象编程语言。在 Apex 类中,语法上可定义方法、变量、静态代码块等,变量用于定义对象的属性,比如对象的名称或者类型,而方法用于定义对象的行为;业务上可将逻辑事件绑定到系统事件中,比如按钮的点击、数据的更新以及操作 Visualforce 页面等。定义好的 Apex 类可被其他类调用,或者作为 Web Service 通过 API 调用。
总的来讲,在 Salesforce 中,Apex 主要以两种形式存在:
以单独的脚本形式,按照用户的需求、业务逻辑执行,可以理解为 Java 项目中的 controller 类。
以触发器 trigger 的形式,trigger 作用于具体的 sObject(参考 “什么是 sObject“),当此 sObject 发生数据更变时就会触发作用于此 sObject 上的 trigger。
Apex 语言特性
Apex 类和 Java 类相似,是创建对象的模版,具有以下语言特性:
面向对象,支持类的接口实现与类继承。
强类型,Apex 类在编译期会验证对对象的引用。
易测试,Apex 类为单元测试的创建,执行以及代码覆盖提供内置支持。
Apex 的开发、编译以及执行在云中进行。
集成数据库,Apex 类可直接访问数据库记录,并且可以直接通过语句来增删改查。
触发器(Trigger),直接作用于对象,类似于数据库系统的触发器。
Apex 支持对数据库的事务访问以及回滚。
Apex 的工作模式
Apex 的工作模式主要是分为开发人员和用户,当开发人员成功提交并编译代码后,用户提出请求后触发 Apex 代码并返回结果,整个过程有两个操作序列,如图 1 所示:
图 1. Apex 工作模式
开发人员操作:从图 1 可 以看出,开发人员编写的代码在 Apex Compiler 编译器编译过后,代码以元数据的形式存储在数据库中,等待用户触发执行。对于开发人员而言,编写好的未编译过的代码,首先提交到 Application Server,编译时验证代码是否正确,比如表名、字段名不匹配或者不存在等问题,然后服务器端会把编译结果返回到开发人员终端(Salesforce 的 developer console 或者本地的 IDE),开发人员收到结果后重新审核代码。
从图 1 还 可以看出,Application Server 上除了编译器之外还有运行期,代码运行期发生的错误是指程序通过了编译没有发生错误,但是程序执行时发生了异常,语法本身没有错,是逻辑上出现了问题。比如代码中需读取配置文件,但是此配置文件丢失了,因为语法上并没有错误,所以通过了编译期,但是代码触发时,却找不到此文件,就会出现运行错误。运行时错误主要会涉及空指针异常、数组下标越界、内存溢出等,这个时候开发人员就需要重新审核业务逻辑后,重新部署代码。
用户操作:当用户提出请求并最终触发 Apex 代码执行时,比如访问 Visualforce 页面后在页面上执行按钮点击事件,平台应用程序服务器从元数据检索编译指令并执行。
Apex 语法介绍
现在您已经初步了解到 Apex 的基本知识并对于 Apex 的工作模式也有了一定的了解。本章主要是介绍 Apex 的语法,包括基本数据类型、集合与数据流程控制语句以及数据操作三部分内容。总体来看,Apex 与 Java 具有很多相似之处,所以如果已经熟悉 Java 的话,对于学习 Apex 有很大的帮助。
常见的数据类型
Apex 的数据类型分为很多种,以下是几种常用的数据类型:
String:用单引号引起来的一组字符的组合,一般用来存储文本信息,如名称、邮箱等内容。
Date/DateTime/Time:一般用来表示日期,其中 Date 用来表示只需要显示日期的值,Time 用来表示时间信息的值,DateTime 用来表示需要显示日期和时间信息的值。
Integer/Long/Double/Decimal:一般都是用来表示数值的类型。
Enum:一般用来列举一个变量的几个不同的取值。
String 类型
String 类型主要用来存储文本信息,它使用单引号将一组字符包围起来。在 Apex 中我们可以创建一个单引号包围的字符串,然后将它赋值给一个 String 类型的变量,如下所示:
String testString = 'just for testing string' ;Show moreShow more icon
除了上面这种方式,我们也可以将其他的类型转变为 String 类型,通过执行 String 类自带的静态 valueOf() 方法可以将其他类型变为 String 类型:
Integer a = 1;
String testVariable = String.valueOf(a);
System.debug(testVariable);Show moreShow more icon
String 类型的数据还支持 + 运算符的操作,如下所示,两个字符串通过 + 运算符拼接在一起就成为了一个新的字符串 'you and'。
String a = 'you';
String b = 'and';
System.debug(a + b);Show moreShow more icon
String 类型的数据对于 == 和 != 两种运算符是大小写不敏感的,比如下面示例中的结果将会返回 true。
String a = 'you';
String b = 'YOU';
System.debug( a == b );Show moreShow more icon
String 类型也包括很多实例方法来处理字符串数据,常用的方法如表 1 所示。
表 1. String 部分实例方法
方法名称
用法length()
判断一个目标字符串的长度。
substring(para1, para2)
系统会对于目标字符串进行截取,产生一个从 para1 位置到 para2 截止的一个新的字符串,其中 para1 和 para2 的计数是从 0 开始。
replaceAll(para1,para2)
全部替换目标字符串中的 para1 为 para2。
endsWith(para)
对于目标字符串的结尾进行判断,如果与 para 一致就返回 true,否则返回 false。
Date/Datetime/Time 类型
Date/Datetime/Time 这三种类型都是与时间有关系的数据类型,其中 Date 类型用来表示只有年、月、日的日期时间,Time 类型用来表示只有时、分、秒、毫秒的时间,Datetime 类型则是对于 Date 与 Time 进行结合展示。Date/Datetime/Time 三种类型都有 newInstance() 方法来构造指定的时间,具体如下所示:
Date myDate = Date.newinstance(1990, 2, 14);
Time myTime = Time.newInstance(16, 29, 1, 10);Show moreShow more icon
我们也可以获取到当前时间的上述三种类型的信息:
Datetime myDateTime = Datetime.now();
Date today = Date.today();Show moreShow more icon
对于 Date 类型的数据可以通过 time() 来转化为 Time 类型的时间:
Time t = DateTime.now().time();Show moreShow more icon
对于 Date/Time/Datetime 类型具有很多实例方法,比如 Datetime 含有 addDays()、addHours()、addMinutes()、dayOfYear()、timeGMT() 等方法用来改变时间数据信息,其中 addDays() 方法示例如下:
Date myToday = Date.today();
Date myNext30 = myToday.addDays(30);Show moreShow more icon
Integer/Long/Double/Decimal 类型
如果想要在 Apex 中存储数值变量信息,就需要将变量声明成 Integer/Long/Double/Decimal 类型的数据。
Integer:表示一个 32 位的不包括小数点的带符号的数值,范围是 -231 ~ 231-1。
Long:表示一个 64 位的不包括小数点的带符号的数值,范围是 -263 ~ 263-1。
Double:表示一个 64 位的包括小数点的带符号的数值,范围与 Long 类型一致。
Decimal:表示一个具有任意精度的带有小数点的并且带符号的数值,当变量需要用到精确的数字信息的时候可以使用 Decimal 类型,它可以在一定范围内不存在数据精度缺失的情况,货币信息会自动默认为 Decimal 类型数据。
这四种类型的具体声明信息如下所示:
Integer i = 0;
Long l = 2147483648L;
Double d = 56.89007;
Decimal dec = 24.908;Show moreShow more icon
我们也可以使用 ValueOf() 的静态方法来实现 String 类型与数值类型的转换,例如从 String 类型变为 Integer 类型:
Integer count = Integer.valueof('30');Show moreShow