jju*_*uma 4 java anonymous-class
这是一个关于Java代码的问题,例如:
List<String> list = new ArrayList<String>() {{add("hello"); add("goodbye");}}
Run Code Online (Sandbox Code Playgroud)
程序员匿名扩展ArrayList只是为了在实例初始化块中推迟.
问题是:如果程序员的唯一目的只是达到以下目的:
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("goodbye");
Run Code Online (Sandbox Code Playgroud)
那么第一种方式做到这一点的意外后果是什么?
cle*_*tus 15
这种代码(在一般情况下)的危险在于你可能会破坏equals()方法.那是因为有两个通用模板equals():
public boolean equals(Object ob) {
if (!(ob instanceof MyClass)) return false;
...
}
Run Code Online (Sandbox Code Playgroud)
和
public boolean equals(Object ob) {
if (ob.getClass() != getClass()) return false;
...
}
Run Code Online (Sandbox Code Playgroud)
第一个仍将使用您正在讨论的匿名子类,但第二个不会.事实上,第二个被认为是最佳实践,因为instanceof不一定是可交换的(意思a.equals(b)可能不相等b.equals(a)).
特别是在这种情况下,ArrayList使用AbstractList.equals()仅检查另一个对象是instanceof接口的方法List,所以你很好.
但是要注意这一点.
我建议的是略有不同:
List<String> list = new ArrayList<String>(
Arrays.asList("hello", "goodbye")
);
Run Code Online (Sandbox Code Playgroud)
当然,它更加冗长,但你不太可能以这种方式遇到麻烦,因为结果类是"纯粹的" ArrayList.
| 归档时间: |
|
| 查看次数: |
1411 次 |
| 最近记录: |