Apex 代码版本

为了帮助向后兼容,类和触发器与版本一起存储 特定 Salesforce API 版本的设置。

如果 Apex 类或触发器引用组件,例如 自定义对象,在已安装的托管包中,每个托管包的版本设置 类引用的包也会被保存。这确保了作为 Apex, API,并且托管包中的组件在后续发布的版本中不断发展,一个 类或触发器仍绑定到具有特定已知行为的版本。

为已安装的包设置版本可确定公开的 接口和任何 Apex 代码的行为 已安装的软件包。这允许您继续引用 Apex 在已安装软件包的最新版本中已弃用,如果您安装了 代码被弃用之前的包。

通常,您引用最新的 Salesforce API 版本和每个已安装的软件包 版本。如果您在未指定 Salesforce API 的情况下保存 Apex 类或触发器 version,则类或触发器与最新安装的版本相关联 违约。如果保存引用 托管包,而不指定托管包的版本、类或 触发器与最新安装的托管软件包版本相关联,具体方法如下 违约。

Apex 类和方法的版本控制

将类和方法添加到 Apex 语言时, 这些类和方法可用于保存 Apex 代码的所有 API 版本 ,无论引入的 API 版本(Salesforce 版本)如何。 例如,如果在 API 版本 33.0 中添加了方法,则可以在 使用 API 版本 33.0 保存的自定义类或使用 API 版本保存的其他类 25.0.

此规则有一个例外。ConnectApi 命名空间的类和方法仅在文档中指定的 API 版本中受支持。为 例如,如果在 API 版本 33.0 中引入了某个类或方法,则该类或方法不可用 在早期版本中。有关更多信息,请参见 ConnectApi 版本控制和相等性检查。

设置类和 Salesforce API 版本 触发器

要为类或触发器设置 Salesforce API 和 Apex 版本,请执行以下操作:

  1. 编辑类或触发器,然后单击“版本” 设置
  2. 选择 Salesforce API 的版本。这个版本也是 与类或触发器关联的 Apex 版本。
  3. 点击保存

如果在方法调用中将对象作为参数从一个 Apex 类 C1 传递到另一个 Apex 类 class、C2 和 C2 由于 Salesforce API 版本而公开了不同的字段 设置,对象中的字段由 C2 的版本设置控制。

在此示例中,Categories 字段设置为从 测试类 C1,因为“类别”字段在 API 的 13.0 版。nullinsertIdea

第一个类使用 Salesforce API 版本 13.0 保存:

// This class is saved using Salesforce API version 13.0
// Version 13.0 does not include the Idea.categories field
global class C2
{
    global Idea insertIdea(Idea a) {
        insert a; // category field set to null on insert
        
        // retrieve the new idea
        Idea insertedIdea = [SELECT title FROM Idea WHERE Id =:a.Id];
        
        return insertedIdea;
    }
}

使用 Salesforce API 版本 16.0 保存以下类:

@IsTest
// This class is bound to API version 16.0 by Version Settings
private class C1
{  
    static testMethod void testC2Method() {
        Idea i = new Idea();
        i.CommunityId = '09aD000000004YCIAY';
        i.Title = 'Testing Version Settings';
        i.Body = 'Categories field is included in API version 16.0';
        i.Categories = 'test';

        C2 c2 = new C2();
        Idea returnedIdea = c2.insertIdea(i);
        // retrieve the new idea
        Idea ideaMoreFields = [SELECT title, categories FROM Idea
             WHERE Id = :returnedIdea.Id];

        // assert that the categories field from the object created
        // in this class is not null
        System.assert(i.Categories != null);
        // assert that the categories field created in C2 is null
        System.assert(ideaMoreFields.Categories == null);
    }
}

设置 Apex 类和触发器的包版本

若要配置类或触发器的包版本设置,请执行以下操作:

  1. 编辑类或触发器,然后单击“版本设置”。
  2. 为类引用的每个托管包选择一个版本,或者 触发。如果出现以下情况,类或触发器将继续使用此版本的托管包 除非您手动更新版本,否则将安装更高版本的托管包 设置。若要将已安装的托管包添加到设置列表,请选择 package。仅当您具有 已安装的托管包尚未与类或触发器关联。
  3. 点击保存

使用包版本设置时,请注意以下事项:

  • 如果保存引用托管包的 Apex 类或触发器,但未指定 托管包的版本,Apex 类或触发器与最新的 默认情况下,托管包的已安装版本。
  • 不能删除托管类或触发器的版本设置 package(如果在类或触发器中引用了该包)。使用显示 用于查找类引用托管包的位置的依赖项,或者 触发。

自定义类型和排序列表

列表可以包含用户定义类型(Apex 类)的对象。可以对用户定义类型的列表进行排序。

若要对此类列表进行排序,Apex 类可以实现接口并将其作为参数传递给方法。或者,您的 Apex 类可以 实现接口。ComparatorList.sortComparable

排序条件和排序顺序取决于为 或 方法提供的实现。Comparable.compareToComparator.compare

若要执行区分区域设置的比较和排序,请使用该类。因为区分区域设置的排序可以产生不同的 结果取决于运行代码的用户,请避免在触发器或代码中使用它 这需要特定的排序顺序。Collator

在映射键和集中使用自定义类型

您可以将自己的 Apex 类的实例添加到映射和集合中。

对于映射,可以将 Apex 类的实例添加为键或值。如果 你把它们添加为键,你的类必须实现一些特殊的规则 使地图正常运行;也就是说,让键获取正确的值。 同样,如果 set 元素是自定义类的实例,则类必须 遵循相同的规则。

警告

如果映射键或设置元素中的对象在发生以下变化时发生更改 添加到集合中,由于字段已更改,将不再找到它 值。

将自定义类型(Apex 类)用于映射键或 set 元素时,请在类中提供 和 方法。Apex 使用这些 确定对象键的相等性和唯一性的两种方法。equalshashCode

将 equals 和 hashCode 方法添加到类中

要确保正确比较自定义类型的映射键,并且其 唯一性可以一致地确定,提供 类中的以下两种方法:

  • 这个方法 签名:equalspublic Boolean equals(Object obj) { // Your implementation }保持 在实现该方法时,请记住以下几点。假设 x、y 和 z 是类的非 null 实例,则该方法必须为:equalsequals
  • 反身:x.equals(x)对称:如果出现以下情况,应返回 并且仅当返回x.equals(y)truey.equals(x)true传递:如果 return 和 returns ,则应返回x.equals(y)truey.equals(z)truex.equals(z)true一致:多次调用一致 return 或 始终如一的回报x.equals(y)truefalse对于任何非 null 引用值 x,应返回x.equals(null)false
  • 中的方法 Apex 基于 爪哇。equals
  • 这个方法 签名:hashCodepublic Integer hashCode() { // Your implementation }保持 在实现该方法时,请记住以下几点。hashCode
  • 如果方法 在执行期间对同一对象多次调用 Apex 请求,它必须返回相同的值。hashCode如果两个对象相等,则根据该方法,必须返回 相同的值。equalshashCode如果两个对象不相等,则根据该方法的结果,它不是 需要返回非重复值。equalshashCode
  • 方法 在 Apex 中基于 爪哇。hashCode

在类中提供该方法的另一个好处是,它简化了对象的比较。您将能够 要使用运算符比较对象, 或方法。为 例:

equals==equals

// obj1 and obj2 are instances of MyClass
if (obj1 == obj2) {
    // Do something
}

if (obj1.equals(obj2)) {
    // Do something
}

样本

此示例演示如何实现 and 方法。该类 前提是这些方法首先列出。它还包含一个构造函数,该构造函数采用 两个整数。第二个示例是一个代码片段,它创建了 类,其中两个具有相同的值。接下来,使用对添加地图条目 对象作为键。该示例验证映射是否只有两个条目,因为 最后添加的条目与第一个条目具有相同的键,因此被覆盖 它。然后,该示例使用运算符 它按预期工作,因为该类实现了 .此外,还会执行一些额外的映射操作,例如 检查映射是否包含某些键,并将所有键和值写入 调试日志。最后,该示例创建一个集合,并向其添加相同的对象。它 验证设置的大小是否为 2,因为三个对象中只有 2 个是 独特。equalshashCode==equals

public class PairNumbers {
    Integer x,y;

    public PairNumbers(Integer a, Integer b) {
        x=a;
        y=b;
    }

    public Boolean equals(Object obj) {
        if (obj instanceof PairNumbers) {
            PairNumbers p = (PairNumbers)obj;
            return ((x==p.x) && (y==p.y));
        }
        return false;
    }

    public Integer hashCode() {
        return (31 * x) ^ y;
    }
}

此代码片段使用该类。PairNumbers

Map<PairNumbers, String> m = new Map<PairNumbers, String>();
PairNumbers p1 = new PairNumbers(1,2);
PairNumbers p2 = new PairNumbers(3,4);
// Duplicate key
PairNumbers p3 = new PairNumbers(1,2);
m.put(p1, 'first');
m.put(p2, 'second');
m.put(p3, 'third');

// Map size is 2 because the entry with 
// the duplicate key overwrote the first entry.
System.assertEquals(2, m.size());

// Use the == operator
if (p1 == p3) {
    System.debug('p1 and p3 are equal.');
}

// Perform some other operations
System.assertEquals(true, m.containsKey(p1));
System.assertEquals(true, m.containsKey(p2));
System.assertEquals(false, m.containsKey(new PairNumbers(5,6)));

for(PairNumbers pn : m.keySet()) {
    System.debug('Key: ' + pn);
}

List<String> mValues = m.values();
System.debug('m.values: ' + mValues);

// Create a set
Set<PairNumbers> s1 = new Set<PairNumbers>();
s1.add(p1);
s1.add(p2);
s1.add(p3);

// Verify that we have only two elements
// since the p3 is equal to p1.
System.assertEquals(2, s1.size());