gpt4 book ai didi

java - 比较两个对象的相等性有哪些替代方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:32:02 25 4
gpt4 key购买 nike

http://leepoint.net/notes-java/data/expressions/22compareobjects.html

It turns out that defining equals() isn't trivial; in fact it's moderately hard to get it right, especially in the case of subclasses. The best treatment of the issues is in Horstmann's Core Java Vol 1.

如果 equals() 必须始终被覆盖,那么避免被迫进行对象比较的好方法是什么?有哪些好的“设计”替代方案?

编辑:

我不确定这是否符合我的预期。也许问题应该更像是“你为什么要比较两个对象?”根据您对该问题的回答,是否有替代的比较解决方案?我不是说 equals 的不同实现。我的意思是,根本不使用平等。我认为关键点是从这个问题开始,为什么要比较两个对象。

最佳答案

If equals() must always be overridden, then what is a good approach for not being cornered into having to do object comparison?

你错了。您应该尽可能少地覆盖 equals。


所有这些信息都来自Effective Java, Second Edition (Josh Bloch)。关于此的第一版章节仍然免费提供 download .

来自 Effective Java:

The easiest way to avoid problems is not to override the equals method, in which case each instance of the class is equal only to itself.

任意覆盖 equals/hashCode 的问题是继承。一些 equals 实现提倡像这样测试它:

if (this.getClass() != other.getClass()) {
return false; //inequal
}

事实上,Eclipse (3.4) 当您使用源工具生成方法时,Java 编辑器就是这样做的。根据 Bloch 的说法,这是一个错误,因为它违反了 Liskov substitution principle .

来自 Effective Java:

There is no way to extend an instantiable class and add a value component while preserving the equals contract.

类和接口(interface)一章描述了两种最小化相等问题的方法:

  1. 优先考虑组合而不是继承
  2. 继承的设计和文件,否则禁止

据我所知,唯一的选择是在类外部的形式中测试相等性,如何执行将取决于类型的设计和您尝试在其中使用它的上下文。

例如,您可以定义一个记录如何进行比较的接口(interface)。在下面的代码中,Service 实例可能会在运行时被同一个类的更新版本替换——在这种情况下,具有不同的 ClassLoader,equals 比较将始终返回 false,因此重写 equals/hashCode 将是多余的。

public class Services {

private static Map<String, Service> SERVICES = new HashMap<String, Service>();

static interface Service {
/** Services with the same name are considered equivalent */
public String getName();
}

public static synchronized void installService(Service service) {
SERVICES.put(service.getName(), service);
}

public static synchronized Service lookup(String name) {
return SERVICES.get(name);
}
}

"Why would you want to compare two objects?"

最明显的例子是测试两个字符串是否相同(或两个 FilesURIs)。例如,如果您想构建一组要解析的文件怎么办。根据定义,该集合仅包含唯一元素。 Java 的 Set类型依赖于 equals/hashCode 方法来强制其元素的唯一性。

关于java - 比较两个对象的相等性有哪些替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/360265/

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