gpt4 book ai didi

java - 为什么 ProcessBuilder 类不重写 equals()?

转载 作者:行者123 更新时间:2023-12-02 06:54:44 25 4
gpt4 key购买 nike

我最近发现了这个类 ProcessBuilder在 JDK6 中不会重写 equals()。有理由吗?由于该类是可变的,我可以理解为什么它不重写 hashCode()

我很惊讶地发现这段代码不起作用:

ProcessBuilder x = new ProcessBuilder("abc", "def");
ProcessBuilder y = new ProcessBuilder("abc", "def");
if (x.equals(y)) { // they are never equal
// something important here
}

我查看了 ProcessBuilder 类的 JDK6 源代码,但没有看到 equals() 的重写。

我有一种感觉,除了这一个类之外,还有更深层次的原因。也许这是故意的?

最佳答案

最好的做法是使可变对象不相等,除非它们是同一个对象。这是因为该对象稍后可能会发生变化。考虑以下因素

Set<ProcessBuilder> pbSet = new HashSet<>();
pbSet.add(x);
pbSet.add(y);
// if x and y were equal pbSet would have one element.
y.setSomething()
// should pbSet have one or two elements.

比这更糟糕的是相反的情况,两个对象可能不同但后来变得相同。这意味着 Set 将有一个重复的对象。

有趣的是集合是可变的,但仍然有 equals 和 hashCode。我认为出现这种情况的原因是不存在不可变的集合。例如String 重写 equals(),StringBuilder 则不会。

关于java - 为什么 ProcessBuilder 类不重写 equals()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513828/

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