假设您编写了一个类并使用惰性初始化来分配其中一个字段。假设对该字段的计算只涉及其他字段,并且保证每次都产生相同的结果。当该类的两个相等实例彼此相遇时,它们共享延迟初始化字段的值(如果其中一个知道)是有意义的。您可以在 equals()
方法中执行此操作。这是一个展示我的意思的类。
final class MyClass {
private final int number;
private String string;
MyClass(int number) {
this.number = number;
}
String getString() {
if (string == null) {
string = OtherClass.expensiveCalculation(number);
}
return string;
}
@Override
public boolean equals(Object object) {
if (object == this) { return true; }
if (!(object instanceof MyClass)) { return false; }
MyClass that = (MyClass) object;
if (that.number != number) { return false; }
String thatString = that.string;
if (string == null && thatString != null) {
string = thatString;
} else if (thatString == null && string != null) {
that.string = string;
}
return true;
}
@Override
public int hashCode() { return number; }
}
对我来说,如果您要努力懒惰地初始化一个字段,那么这种信息共享似乎是合乎逻辑的事情,但我从未见过有人使用 equals()
方法。
这是一种常见的还是标准的技术?如果是这样,它叫什么?如果这不是一种常见的技术,我可以问(冒着将问题搁置为主要基于意见的风险)人们对它的看法吗?除了检查相等性之外,使用 equals()
方法做任何事情是个好主意吗?
最佳答案
这对我来说看起来很危险:使用 Object 的公共(public)方法的副作用来设置对象的状态。如果您对此类进行子类化,然后覆盖子类的 equals 方法,这将中断,这是一种常见的做法。只是不要这样做。
关于java - 在 equals() 方法中分配字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27586447/