繁体   English   中英

getter 可以用在 equals 和 hashcode 中吗?

[英]can getters be used in equals and hashcode?

我有下面的代码覆盖 equals() 和 hashcode() 方法。

public boolean equals(Object obj)
 {
   if (obj == null)
     return false;
   if (!(obj instanceof Name))
     return false;
   Name name = (Name) obj;
   return this.name.equals(name.name);
 }

 public int hashCode()
 {
   return name.hashCode();
 }

我可以在这里替换以下 2 行:

return this.name.equals(name.name);
return name.hashCode();

return this.getName().equals(name.getName());
return getName().hashCode();

我的意思是我可以直接在 equals 和 hashcode 方法中使用 getter 而不是使用属性吗?

谢谢!

的,你可以使用这个,

hashcode()equals()是字段方法,它们可以直接访问私有成员,但是如果访问方法中包含一些逻辑怎么办,那么使用访问方法访问字段总是安全的

是的,我强烈建议在equals() & hashCode()实现中使用 getter。 据我所知,这不会以任何方式伤害您。

当您比较两个代理对象时,没有 getter 的equals()实现将无法为您提供正确的结果。

例如:如果您尝试比较底层 hibernate dao 返回的两个代理对象,您将永远不会从equals()方法收到true ,即使它们是相同的对象。

更新

使用 getter 方法而不是直接访问。 这是因为作为 other 传递的 object 实例可能是代理 object,而不是实际实例。 要初始化此代理,您需要使用 getter 方法访问它。

检查以获取更多信息。

你可以,但你为什么要这样做? 选项 A:编译器将其内联,因此无论如何您最终都会得到对该字段的引用。 选项 B:编译器不内联调用,即您引入了一个额外的方法调用。

易读性也有影响——如果在 class 中可以直接访问name字段,为什么不直接引用它呢? 我发现这更容易阅读,但有些人发现它不一致。

是的,你为什么不能?

以后遇到这样的事情,还是建议大家试试看。

是的你可以。 为什么不? 你有什么疑问?

不。

hashCode()中使用的字段应该是final值类型。 如果不是,实例的 hash 在添加到 map 或 set 后可能会发生变化,这将导致运行时错误,例如Map无法找到您刚刚放入其中的实例。

由于equals()的行为必须与hashCode()相同,因此此要求也会泄漏到equals()中。 由于字段是final的,子类不应该覆盖 getter,因此它们也应该是final的。

当 getter 是final时,没有必要在equals() / hashCode()中使用它:输入更多的字符,读取更多的代码,使编译变慢(编译器必须考虑内联它),可能会使执行变慢.

有关 equals()/hashCode() 的许多陷阱的更多信息,请参阅优秀的EqualsVerifier

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM