Differences Between Apex Classes and Java Classes

DEX455 - Apex 类与 Java 类的区别

📄 第 146 页 🎬 视频课程

课程章节介绍

今天我们来看看 Apex 的类,它跟 Java 的类用起来很像,但有一些不一样的地方,这些差异在写代码的时候一定要注意。 首先,Apex 里的内部类跟 Java 的内部类规则不同。在 Java 里,内部类可以访问外部类的私有成员;但在 Apex 里,内部类和外部类更像是两个独立的类,内部类不能直接访问外部类的实例变量或方法,除非你给它传过去。所以不要把 Java 的习惯带进来。 然后是静态方法,Apex 里的静态方法有一些限制。它不能访问任何非静态的成员,包括实例变量和非静态方法。这一点跟 Java 类似,但 Apex 的静态上下文隔离得更彻底,要注意。 接下来是访问修饰符。Apex 的访问修饰符有 public、private、global 和 protected。注意这里的 global 修饰符是 Salesforce 特有的,它用于让一个类或方法在整个 Salesforce 组织的命名空间之外也能被访问,比如在托管包之间共享。而 Java 里没有 global,这是关键差异。protected 在 Apex 里跟 Java 的实现也有点区别,在 Apex 里 protected 只能用于内部类和接口,不像 Java 那样可以用于方法和变量,使用范围小很多。 还有一个容易被忽略的点,Apex 的类默认是 final 的。在 Java 里,类默认是可以被继承的,除非你明确写 final;但在 Apex 里,如果你想让一个类可以被扩展,必须显式加上 virtual 关键字,因为类的默认行为是 final,也就是不可继承。这个跟 Java 完全相反。 关于异常,Apex 自定义异常类必须继承自某个已有的 Exception 类,不能随便丢一个对象,这和 Java 一样,但是 Apex 内置异常类型更少,要建自定义异常就 extend Exception。 在开发环境里,Apex 的类编辑器是 Salesforce 平台自带的,它有一些命名约定:类名通常是大写字母开头,跟 Java 一样,但不允许你用某些保留关键字做类名。还有,所有的 Apex 代码在保存时都会被编译,语法错误会直接提示。 如果你在开发托管包,命名空间前缀是一个重要的概念。你的类在包里会带上命名空间,比如你的命名空间叫 myns,那类名实际上是 myns__MyClass,使用时要注意加上这个前缀。但在您自己的开发组织里,写代码时可以省略命名空间,部署到包环境里,系统会自动处理。 说到版本控制,Salesforce 有向后兼容的 API 代码版本控制功能。你可以为你的 Apex 类指定特定的 API 版本,这样即使平台更新了,代码行为依然保持那个版本下的表现,不会因为平台升级而突然报错。这会通过类文件的元数据 xml 里的版本来设置。 最后,使用集合类型如 List、Map、Set 存放自定义类型的时候,要注意排序和相等性。如果你要把自定义对象作为 Map 的键,或者用 Set 去重,就必须实现正确的 hashCode 和 equals 方法。这两个方法决定了对象如何在集合里比较和存储,不重写的话,默认是用对象的地址,可能不是你想要的结果。要实现 Comparable 接口来自定义排序,就得提供 compareTo 方法。 总的来说,Apex 的类与 Java 很相似,但在很多细节上不一样,开发的时候一定要掌握这些差异,特别是默认 final、静态方法限制、访问修饰符里的 global、还有集合中自定义对象的使用问题,这样才能写出可靠、好维护的代码。 今天就讲到这儿,我们下次再继续深入了解 Apex 的其他特性。

关键词

Apex Salesforce Developer Guide