gpt4 book ai didi

java - 为添加实例初始化 block 而创建的匿名类的意外后果

转载 作者:搜寻专家 更新时间:2023-11-01 01:01:23 25 4
gpt4 key购买 nike

这是一个关于 Java 代码的问题,例如:

List<String> list = new ArrayList<String>() {{add("hello"); add("goodbye");}}

程序员匿名扩展 ArrayList 只是为了插入实例初始化 block 。

问题是:如果程序员的唯一目的仅仅是为了实现与:

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;
...
}

public boolean equals(Object ob) {
if (ob.getClass() != getClass()) return false;
...
}

第一个仍然可以与您正在谈论的匿名子类一起使用,但第二个不会。事实是,第二个被认为是最佳实践,因为 instanceof 不一定是可交换的(意思是 a.equals(b) 可能不等于 b.equals(a) )。

特别是在这种情况下,ArrayList 使用 AbstractList.equals() 方法,该方法仅检查另一个对象是 instanceof 接口(interface)List,所以你没问题。

然而,这是需要注意的事情。

我的建议是稍微改变一下:

List<String> list = new ArrayList<String>(
Arrays.asList("hello", "goodbye")
);

当然,它更冗长,但您不太可能以这种方式遇到麻烦,因为生成的类是“纯”ArrayList

关于java - 为添加实例初始化 block 而创建的匿名类的意外后果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/671644/

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