概述
Apex 编程语言是一种面向对象的编程语言,它用于在 Salesforce 平台上开发自定义逻辑、自动化任务和集成。它的语法与 Java 类似,并支持面向对象的特性,如类、对象、继承、多态等。
1. 类的定义
在 Apex 中,类是对一组相关数据和方法的封装。类定义了对象的行为和状态。类可以包含字段(数据)和方法(操作)。下面是一个简单的类定义示例:
public class Car {// 成员变量(字段)public String make;public String model;public Integer year;// 构造函数public Car(String make, String model, Integer year) {this.make = make;this.model = model;this.year = year;}// 成员方法(行为)public void displayInfo() {System.debug('Make: ' + make + ', Model: ' + model + ', Year: ' + year);}
}
解释:
- public class Car:定义了一个 Car 类。
- 成员变量:类的字段 make、model 和 year,它们描述了 Car 类的状态。
- 构造函数:Car 类的构造函数,用于初始化类的对象。在创建对象时传入 make、model 和 year,然后赋值给对应的字段。
- 成员方法:displayInfo 方法用来输出车的信息。
2. 创建对象
在 Apex 中,可以通过使用类的构造函数来创建对象。下面是创建 Car 类对象并调用其方法的示例:
public class CarTest {public static void main() {// 创建 Car 类的对象Car myCar = new Car('Tesla', 'Model S', 2021);// 调用对象的方法myCar.displayInfo();}
}
解释:
创建对象:使用 new Car() 创建 Car 类的对象,并传入构造函数所需的参数。
调用方法:通过 myCar.displayInfo() 调用 Car 类中的 displayInfo 方法,输出 myCar 对象的信息。
3. 类的继承
Apex 支持类的继承,可以通过继承父类来创建子类,从而复用父类的代码。下面是一个继承示例:
virtual 类:一个类被声明为 virtual 时,表示它可以被其他类继承。默认情况下,Apex 中的类是不可继承的
public virtual class Car {// 成员变量(字段)public String make;public String model;public Integer year;// 构造函数public Car(String make, String model, Integer year) {this.make = make;this.model = model;this.year = year;}// 成员方法(行为)public virtual void displayInfo() {System.debug('Make: ' + make + ', Model: ' + model + ', Year: ' + year);}
}
public class ElectricCar extends Car {public Integer batteryCapacity;// 构造函数public ElectricCar(String make, String model, Integer year, Integer batteryCapacity) {// 调用父类的构造函数super(make, model, year);this.batteryCapacity = batteryCapacity;}// 重写父类的方法public override void displayInfo() {super.displayInfo(); // 调用父类的 displayInfo 方法System.debug('Battery Capacity: ' + batteryCapacity + ' kWh');}
}
解释:
继承:ElectricCar 类继承自 Car 类,通过 extends 关键字来实现。
构造函数:ElectricCar 类的构造函数调用了父类 Car 的构造函数(通过 super 关键字),并初始化了 batteryCapacity 字段。
方法重写:ElectricCar 重写了 displayInfo 方法,在父类方法的基础上添加了额外的功能。
4.多态
Apex 支持多态,意味着可以通过父类引用指向子类对象。下面是一个多态的示例:
public class VehicleTest {public static void main() {// 创建父类和子类的对象Car myCar = new Car('Toyota', 'Camry', 2020);ElectricCar myElectricCar = new ElectricCar('Nissan', 'Leaf', 2022, 62);// 创建父类引用指向子类对象Car myVehicle = myElectricCar;// 调用方法myVehicle.displayInfo(); // 由于多态,调用的是 ElectricCar 类中的 displayInfo 方法}
}
解释:
多态:Car 类型的变量 myVehicle 可以指向 ElectricCar 类的对象 myElectricCar。
方法调用:通过 myVehicle.displayInfo() 调用的是 ElectricCar 类中的 displayInfo 方法,而不是 Car 类中的方法。这是因为 myVehicle 实际上指向的是 ElectricCar 类的对象。
以上总结
类:类是数据和方法的封装,定义了对象的属性和行为。可以包含字段、构造函数和方法。
对象:对象是类的实例,通过 new 关键字创建。对象拥有类定义的属性和行为。
继承:子类可以继承父类的属性和方法,复用代码。
多态:可以使用父类类型的引用来指向子类对象,从而调用子类重写的方法。
Apex 数据类型
Apex 支持多种数据类型,下面是一些常见的基本数据类型:
基本数据类型:包括 Integer(整数)、Long(长整数)、Double(浮动小数)、String(字符串)、Boolean(布尔值)、Date(日期)、Datetime(日期时间)、Time(时间)等。
集合类型:
List:用于存储一组有序的数据,数据类型可以是任何 Apex 类型。
List<String> names = new List<String>{'Alice', 'Bob', 'Charlie'};
Set:用于存储唯一的元素,无序的。
Set<Integer> numbers = new Set<Integer>{1, 2, 3, 3}; // 重复的3只存储一次
Map:用于存储键值对的集合,类似于 Java 中的 HashMap。
Map<String, Integer> ageMap = new Map<String, Integer>{'Alice' => 25, 'Bob' => 30};
sObject:是 Salesforce 平台特有的数据类型,表示数据库中的记录(例如 Account、Contact 等)。
1.使用点符号(Dot Notation)赋值。
// 创建一个 sObject 类型的对象
Account acc = new Account();// 通过点符号赋值
acc.Name = 'Acme Corporation';
acc.Industry = 'Technology';
acc.AnnualRevenue = 1000000.0;// 插入记录
insert acc;
2.使用 put 方法赋值
// 创建一个 sObject 类型的对象
Account acc = new Account();// 使用 put 方法赋值,字段名需要传入 API 名称
acc.put('Name', 'Acme Corporation');
acc.put('Industry', 'Technology');
acc.put('AnnualRevenue', 1000000.0);// 插入记录
insert acc;
3.通过构造函数进行赋值
// 使用构造函数创建并赋值
Account acc = new Account(Name = 'Acme Corporation',Industry = 'Technology',AnnualRevenue = 1000000.0
);// 插入记录
insert acc;
Apex 事务控制
DML 操作:
Apex 提供了多种 DML 语句来对数据库中的记录进行增、删、改、查等操作:
// 插入记录
insert new Account(Name = 'New Account');// 更新记录
update acc;// 删除记录
delete acc;// 查询记录
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Name = 'New Account'];
事务控制:
可以通过 Database.rollback 来回滚事务,或者使用 Database.saveResult 来检查 DML 操作的结果。
Database.rollback(savepoint);
Apex 测试
Apex 具有内置的单元测试功能,测试代码必须覆盖一定比例的业务逻辑。所有的测试必须在 @isTest 注解的类中进行。
创建测试类:
@isTest
private class MyTestClass {@isTeststatic void testAccountInsert() {Account testAccount = new Account(Name = 'Test Account');insert testAccount;System.assertNotEquals(testAccount.Id, null);}
}
测试方法:使用 System.assert 来验证操作的正确性。
System.assertEquals(expected, actual, '错误信息');
模拟数据:使用 Test.startTest() 和 Test.stopTest() 来帮助模拟和控制测试执行时间。
Test.startTest();
// 执行操作
Test.stopTest();
Salesforce 安全性和共享规则
在 Apex 中处理数据时,要考虑数据的安全性和共享规则:
- with sharing:表示类中的代码将遵循 Salesforce 的共享规则,限制用户对数据的访问。
- without sharing:表示类中的代码不遵循共享规则,允许访问所有数据(通常仅在管理员角色下使用)。