这是一个关于 Java 代码的问题,例如:
List<String> list = new ArrayList<String>() {{add("hello"); add("goodbye");}}
程序员匿名扩展 ArrayList 只是为了推入实例初始化块。
问题是:如果程序员的唯一意图仅仅是实现以下目标:
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("goodbye");
那么第一种方法会带来什么意想不到的后果呢?
执行此类代码(在一般情况下)的危险在于您可能会破坏equals()
方法。这是因为有两个通用模板equals()
:
public boolean equals(Object ob) {
if (!(ob instanceof MyClass)) return false;
...
}
and
public boolean equals(Object ob) {
if (ob.getClass() != getClass()) return false;
...
}
第一个仍然适用于您正在讨论的匿名子类,但第二个则不行。事实是,第二个被认为是最佳实践,因为 instanceof 不一定可交换的(意义a.equals(b)
可能不等于b.equals(a)
).
但具体在这种情况下ArrayList
使用AbstractList.equals()
方法仅检查另一个对象是否是instanceof
界面List
,所以你很好。
然而,这是需要注意的事情。
我建议采取稍微不同的做法:
List<String> list = new ArrayList<String>(
Arrays.asList("hello", "goodbye")
);
当然,它更啰嗦,但你不太可能以这种方式遇到麻烦,因为生成的类是“纯”类ArrayList
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)