gpt4 book ai didi

java - 更改存储在集合中的对象的状态

转载 作者:行者123 更新时间:2023-11-29 05:49:14 25 4
gpt4 key购买 nike

对于如何处理存储在 Set 中的可变对象,有什么好的建议吗?

某些对象可能会根据其内部状态定义它们的相等性(和 hashCode)。当此类对象存储在受控代码内部或外部的 Set 中时,状态的突变可能会导致 Set 中的不一致。

除了不要这样做之外,是否有任何“最佳实践”来避免或处理这种情况?

示例代码:

static class A {
String s;
public boolean equals(Object o) {
return s.equals(((A)o).s);
}
public int hashCode() {
return s.hashCode();
}
public String toString() {
return s;
}

}

public static void main(String[] args) {
A a0 = new A();
a0.s = "Hello";
A a1 = new A();
a1.s = "World";

HashSet<A> set = new HashSet<A>();
set.add(a0);
set.add(a1);

System.out.println(set);

a0.s = "World";

System.out.println(set);
}

最佳答案

在某些时候,开发团队在处理实体集合时经常遇到这个问题,这些实体集合在存储到数据库之前只获得了它们的 key 。他们的哈希码/等于取决于那个键...

我们提出的解决方案大致如下:

public static <P> void rearrange(Set<P> set) {
HashSet<P> temp = new HashSet<P>();
temp.addAll(set);
set.clear();
set.addAll(temp);
}

另一个想法是装饰 HashSet 的 Set 实现,但我们很快决定从长远来看这会导致更多问题。大多数情况下,上述方法是由“框架”代码执行的,对开发人员来说是透明的,但我对这个解决方案仍然不是特别满意。

关于java - 更改存储在集合中的对象的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14622509/

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