Apex 入门教程
学习目标
完成本单元后,您将能够:
- 描述 Apex 编程语言的主要特性。
- 保存 Apex 类并使用 Anonymous.Apex 调用类方法。
- 使用 Developer Console 检查调试日志。
开始之前
我们很高兴跟您一起探索 Apex。此模块将介绍编程语言的基本信息,也会快速深入。如果这是您首次了解 Apex,我们强烈建议您先完成快速入门:Apex 项目,然后再回来继续此模块,我们会等着您!
Apex 是什么?
Apex 是一种编程语言,它具有类似 Java 的语法,其用法与数据库存储过程类似。Apex 允许开发人员将业务逻辑添加到系统事件中,例如按钮的点击、相关记录的更新以及操作 Visualforce 页面等。
作为一种编程语言,Apex 具有以下特点:
- 可托管 — Apex 在 Lightning 平台服务器上保存、编译和执行。
- 面向对象 — Apex 支持类、接口和继承。
- 强类型 — Apex 会在编译过程中验证对对象的引用。
- 多租户防范 — 由于 Apex 在多租户平台上运行,因此通过实施限制来严密防范代码失控,防止代码独占共享资源。
- 与数据库集成 — 直接访问并操作记录。Apex 可直接访问记录和其字段,并提供操作这些记录的语句和查询语言。
- 数据集中 — Apex 支持数据库的事务性访问,允许回滚操作。
- 使用简便 — Apex 基于熟悉的 Java 习惯用语。
- 测试方便 — Apex 为单元测试的创建、执行和代码覆盖提供内置支持。Salesforce 确保所有的自定义 Apex 代码在任何平台升级之前通过执行所有单元测试按照预期来运行。
- 版本控制 — 针对不同版本的 API 保存自定义 Apex 代码。
Apex 语言的亮点
与其他面向对象的编程语言一样,Apex 支持以下语言结构:
- 类、接口、属性和集合(列表、映射和集合)。
- 对象和数组符号。
- 表达式、变量和常量。
- 条件语句 (if-then-else) 和控制流语句(for 循环和 while 循环)。
不同于其他面向对象的编程语言,Apex 支持以下特性:
- 云开发,即 Apex 在云上存储、编译和执行。
- 触发器,类似于数据库系统中的触发器。
- 数据库语句,允许直接调用数据库和查询语言,以查询和搜索数据。
- 事务和回滚。
-
global
(全局)访问修饰符,比public
(公开)修饰符更加宽松,允许在命名空间和应用程序之间访问。
- 自定义代码的版本控制。
此外,Apex 语言不区分大小写。
开发工具
您可以使用 Salesforce Extensions for Visual Studio Code 在您的客户端电脑上编写和调试 Apex。请参见 Salesforce Visual Studio Code Extensions(Salesforce Visual Studio 代码扩展)。
您还可以直接在浏览器中使用 Salesforce 的用户界面编写 Apex 并访问调试信息。在您的名字或快速访问菜单 () 下打开 Developer Console。
数据类型概览
Apex 支持多种数据类型,包括 Salesforce 独有的数据类型 — sObject 数据类型。
Apex 支持以下数据类型。
- 基元,例如 Integer、Double、Long、Date、Datetime、String、ID、Boolean 等。
- sObject,包含泛型 sObject 和特定 sObject,例如客户、联系人或 MyCustomObject__c(您将在后面的单元中了解关于 sObject 的更多信息。)
- 集合,包括:
- 基元、sObject、用户定义对象、从 Apex 类或集合创建的对象列表
- 一组基元、sObject、用户定义对象、从 Apex 类创建的对象或集合
- 从基元到基元、sObject 或集合的映射
- 类型化的值列表,也被称为枚举
- 用户定义的 Apex 类
- 系统提供的 Apex 类
Apex 集合:List
列表保存相同类型的有序数据集合。
以下两个声明是等效的。通过 List 语法声明 colors
变量。
List<String> colors = new List<String>();
或者,可以使用数组符号来声明 colors
变量。
String[] colors = new List<String>();
根据需要用 List.add()
方法添加新元素来扩大集合。您可以使用方括号数组符号按索引引用集合中的现有元素。但是您不能用方括号数组符号添加更多元素。
此示例显示创建列表后,如何向列表添加元素,然后用 add()
方法添加更多元素。
// Create a list and add elements to it in one step List<String> colors = new List<String> { 'red', 'green', 'blue' }; // Add elements to a list after it has been created List<String> moreColors = new List<String>(); moreColors.add('orange'); moreColors.add('purple');
可以通过在方括号之间指定索引来读取列表元素,这称为数组符号。同样,您也可以通过 get()
方法来获取 list 元素。此示例基于上一个示例中创建的列表,并展示了如何使用任一方法来读取 list 元素。该示例还展示了如何遍历列表元素。
// Get elements from a list String color1 = moreColors.get(0); String color2 = moreColors[0]; System.assertEquals(color1, color2); // Iterate over a list to read elements System.debug('Print out the colors in moreColors:'); for(String color : moreColors) { // Write value to the debug log System.debug(color); }
Apex 类
Apex 类的优点之一就是代码的复用性。类中的方法能被触发器或其他类调用。以下教程将为您演示如何在组织中保存示例类、使用类发送电子邮件以及检查调试日志。
保存 Apex 类
在组织中保存 EmailManager
类:
- 在您的名字或快速访问菜单 () 下打开 Developer Console。
- 在 Developer Console 中,单击 File(文件)| New(新建)| Apex Class(Apex 类),并输入 EmailManager 类名,然后单击确定。
- 用
EmailManager
类示例替换默认类正文。EmailManager
类有一个公共方法 (sendMail()
),用于发送电子邮件并使用 Apex 类库的内置消息传递方法。此外,这个类还有一种私有辅助方法 (inspectResults()
),由于私有的性质,仅允许在类中使用,不支持外部调用。此辅助方法用于检查电子邮件发送调用的结果,并通过sendMail()
发起调用。public class EmailManager { // Public method public void sendMail(String address, String subject, String body) { // Create an email message object Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); String[] toAddresses = new String[] {address}; mail.setToAddresses(toAddresses); mail.setSubject(subject); mail.setPlainTextBody(body); // Pass this email message to the built-in sendEmail method // of the Messaging class Messaging.SendEmailResult[] results = Messaging.sendEmail( new Messaging.SingleEmailMessage[] { mail }); // Call a helper method to inspect the returned results inspectResults(results); } // Helper method private static Boolean inspectResults(Messaging.SendEmailResult[] results) { Boolean sendResult = true; // sendEmail returns a list of result objects. // Iterate through the list to inspect results. // In this class, the methods send only one email, // so we should have only one result. for (Messaging.SendEmailResult res : results) { if (res.isSuccess()) { System.debug('Email sent successfully'); } else { sendResult = false; System.debug('The following errors occurred: ' + res.getErrors()); } } return sendResult; } }
- 单击 File(文件)| Save(保存)保存您的类。
注意:如果代码的语法不正确,则“问题”选项卡中会显示错误。您可以使用错误详细信息来更正代码。
调用方法发送电子邮件
让我们调用公共方法吧。我们将使用匿名 Apex 来执行此操作。匿名 Apex 允许您动态运行代码行,是调用 Apex 的一种简便方法,尤其适用于功能测试。与其他 Apex 执行一样,也会生成调试日志结果。
- 在 Developer Console 中,单击 Debug(调试)| Open Execute Anonymous Window(打开执行匿名窗口)。
- 在打开的窗口中,输入以下内容。将 'Your email address’ 替换为自己的电子邮件地址。
EmailManager em = new EmailManager(); em.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
- 单击 Execute(执行)。
您现在应该会在收件箱中收到一封电子邮件。查看电子邮件!
查看调试日志
调试日志对调试代码很有帮助。当执行 Apex 方法时,所有调用情况都会记录在调试日志中。当然您也可以在日志中写入自己的调试消息,帮助您调试代码以确定是否包含错误信息。inspectResults()
辅助方法由 sendMail()
调用,通过使用 System.debug()
方法将消息写入日志,以指示电子邮件发送操作是成功还是包含错误。您可以在执行该方法时生成的调试日志中查找这些消息。
- 在 Developer Console 中,单击 Logs(日志)选项卡,然后双击列表中最近的日志。
- 选择 Debug Only(仅调试)筛选日志,只显示
System.debug()
语句的日志行。
假设电子邮件没有发送错误,您将在已筛选的日志视图中看到以下消息。
DEBUG|Email sent successfully
调用静态方法
由于类中的 sendMail()
方法没有访问类中的成员变量,因此不需要使用实例方法。现在我们将这个方法改成静态方法,即在方法声明中添加 static
关键字。静态方法的调用比实例方法更简便,它不需要在类的实例上调用,而是直接通过类名来调用。
- 在 Developer Console 中,找到
EmailManager
类的打开选项卡,将sendMail()
方法定义的第一行修改为以下内容(唯一的变化是添加了static
关键字。)public static void sendMail(String address, String subject, String body) {
- 单击 File(文件)| Save(保存)保存您的类。
- 修改 Execute Anonymous(执行匿名) 窗口中的语句以调用类名上的静态方法。
EmailManager.sendMail('Your email address', 'Trailhead Tutorial', '123 body');
- 单击执行。现在已经执行了此方法,您可以像前面的步骤一样检查您的电子邮件,也可以查看调试日志。
资源