gpt4 book ai didi

Java 如何避免相互引用的对象的 equals 和 hashCode 方法中的递归

转载 作者:行者123 更新时间:2023-11-30 06:22:17 25 4
gpt4 key购买 nike

我正在制作一个java库,遇到了类似的问题:Foo类的对象主要存储Bar类的对象,但也存储一些其他数据。 Bar 对象存储各种数据,包括对创建它的 Foo 对象的引用(注意:Foo 和 Bar 都是不可变的)

class Foo {

private final Bar[] bars;

public Foo(int length) {
this.bars = new Bar[length];
for (int i = 0; i < bars.length; i++) bars[i] = new Bar(this);
}

}

class Bar {

public final Foo foo;

public Bar(Foo foo) {
this.foo = foo;
}

}

这一切都很好,但是当我尝试创建 equals 和 hashCode 方法时,我发现由于 Foo.bars 是 Foo 对象标识的基础,而 Bar.foo 是 Bar 对象标识的基础,Bar.equals 称为 Foo.equals,Foo.equals 称为 Bar.equals(间接通过 java.util.Arrays.equals),hashCode 也是如此。这显然是无限递归的,因此必须改变。我的问题是:除了让一个人在平等方面忽视另一个人之外,有没有办法避免这种情况?如果不是,我该如何选择哪个应该忽略另一个?

最佳答案

equals() 最简单的解决方案是首先比较身份来短路:

public boolean equals(Object o) {
if (o == this) {
return true;
}
// check type and fields etc.
}

关于Java 如何避免相互引用的对象的 equals 和 hashCode 方法中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com