课程章节介绍
好,我们来看这一节内容。假如你在 Apex 里自定义了一个类,比如一个“学生”类,有姓名和学号。然后你想把这个学生对象放进一个 Set 集合里,或者作为 Map 的键来用。
这时你要注意了,Apex 需要知道怎么判断两个学生对象是不是同一个。默认情况下,它是按内存地址比较的,也就是两个内容完全一样的学生对象,只要不是同一个引用,就会被当成不同的元素。这往往不是我们想要的结果,对吧?
所以,你必须在你自定义的类里,自己写两个特殊的方法:,equals, 和 ,hashCode,。
,equals 方法,就是用来定义“相等”的规则。通常你会把关键字段的值逐个比较,全都一样才算相等。
,hashCode 方法,要返回一个整数,而且规则是:如果两个对象 equals 返回 true,那它们的 hashCode 也必须相同。这个哈希值会被集合内部用来快速定位对象,保证唯一性。
举个例子,你的学生类如果只要学号相同就是同一个学生,那么 equals 就只比较学号,hashCode 也基于学号生成。
还有个很重要的警告:,如果你把一个对象放进 Set 或作为 Map 的键之后,又修改了它的某个字段值,那可就糟了。, 因为它的哈希值也变了,集合内部就再也找不到这个对象了,就变成了“幽灵”成员,容易产生 bug。所以,最好保证放进集合的对象在之后不要被修改,或者说让这些关键字段不可变。
最后告诉你一个额外的好处:一旦你正确实现了 equals 和 hashCode,咱们常用的双等号“==”也会变聪明。它不再傻傻地比较内存引用,而是会调用你写的 equals 方法,按值来比较,这样代码就更符合直觉啦。
简单总结一下:自定义类型要放进集合当键或元素,千万别忘了重写 equals 和 hashCode,还要记得对象一旦放进去,就别再动它的关键字段了。明白了吗?
关键词
Apex
Salesforce
Developer Guide