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 扩展轻松开发。
您还可以直接在浏览器中使用 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');
- 单击执行。现在已经执行了此方法,您可以像前面的步骤一样检查您的电子邮件,也可以查看调试日志。
资源