我想确定对象中的字段是否包含任何指针别名?
例如:
class A {
A a1;
A a2;
}
A z = new A();
A y = new A();
y.a1 = z;
y.a2 = z;
A x = new A();
x.a1 = y;
x.a2 = z;
// i.e. x has a reference to y and to z, and y has a reference to z
在这个例子中,我想确定对象x包含指针别名,因为x.a1.a1 == x.a2
我的想法是使用反射来迭代对象的引用字段,并且对于每个字段,通过遍历存储引用的每个字段来构建一组引用(即将每个引用展平为一组引用)。然后我会看看这些集合的交集。 这是我的问题的一个很好的解决方案吗?
答案 0 :(得分:2)
如果我理解您的需要,那么您需要的是IdentityHashSet
:
public static boolean hasLoops(final A a)
{
if (a.a2 == null)
return false;
final Set<A> set = new IdentityHashSet<>();
set.add(a.a2);
A other = a.a1;
while (other != null) {
if (!set.add(other))
return true;
other = other.a1;
}
return false;
}
由于你想要相同引用的相等性,IdentityHashSet
就是你想要的;虽然如果你没有实施.equals()
或.hashCode()
,那么“常规”HashSet
也可以做到这一点。