java - 在 equals() 方法中分配字段

标签 java equals lazy-initialization

假设您编写了一个类并使用惰性初始化来分配其中一个字段。假设对该字段的计算只涉及其他字段,并且保证每次都产生相同的结果。当该类的两个相等实例彼此相遇时,它们共享延迟初始化字段的值(如果其中一个知道)是有意义的。您可以在 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/

相关文章:

c++ - 有没有一种方法可以延迟初始化类的静态子对象?

python - 用于延迟初始化的代理对象

Java 正则表达式 : Cannot match angular brackets

java - 霍夫曼节点和 NullPointerException

java - 在 Windows 10 上安装 weblogic server12.1 时出现错误

java - 带条件获取数组列表的最后一个索引

java - 我无法理解以下代码中的某一行

java - equalsIgnoreCase() 方法内有多个参数

java - 在 Spring MVC 中修改表单

scala - 如何使用延迟初始化对元组进行模式匹配?