[英]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.