我有以下代码覆盖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而不是使用属性吗?
谢谢!
答案 0 :(得分:4)
是确定您可以使用此功能
hashcode()
和equals()
是字段方法,它们可以直接访问私有成员,但是如果在访问器方法中包含了一些逻辑,那么使用访问器方法访问字段总是安全的
答案 1 :(得分:2)
你可以,但为什么你呢?选项A:编译器内联,因此您最终会得到对该字段的引用。选项B:编译器没有内联调用,即你引入了一个额外的方法调用。
对易读性也有影响 - 如果name
字段可以在类中直接访问,为什么不直接引用它?我发现这更容易阅读,但有些人发现它不一致。
答案 2 :(得分:2)
是的,我强烈建议您在equals() & hashCode()
实施中使用getter。据我所知,这不会以任何方式伤害你。
在比较两个代理对象时,没有getter的equals()
的实现将无法为您提供正确的结果。
例如:如果您尝试比较底层hibernate dao返回的两个代理对象,您将永远不会从equals()
方法接收 true ,即使他们是相同的对象。
<强>更新强>
使用getter方法而不是直接访问。这是因为 作为其他传递的对象实例可能是代理对象,而不是实际的 实例。要初始化此代理,您需要使用a来访问它 getter方法。
查看this了解详情。
答案 3 :(得分:0)
是的,你为什么不能这样做?
将来,有了这样的事情,我建议你试试看。
答案 4 :(得分:0)
是的,你可以。为什么不?你有什么疑问?