7

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

谢谢!

4

5 回答 5

4

的,你可以使用这个,

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

于 2012-04-09T10:52:57.600 回答
3

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

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

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

更新

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

检查以获取更多信息。

于 2016-11-09T15:00:53.177 回答
2

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

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

于 2012-04-09T11:00:05.383 回答
0

是的,你为什么不能呢?

将来,对于这样的事情,我建议您尝试一下。

于 2012-04-09T10:52:59.067 回答
0

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

于 2012-04-09T10:54:35.900 回答