可以在equals和hashcode中使用getter吗?

时间:2012-04-09 10:51:15

标签: java

我有以下代码覆盖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而不是使用属性吗?

谢谢!

5 个答案:

答案 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)

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