【发布时间】:2013-07-22 07:24:42
【问题描述】:
几天前,我们在公司内切换到 Java 7 - 终于! Jay \o/ 所以我发现了Objects 类,并惊讶于hashCode() 和equals() 方法的实现如此之短,与默认情况下由eclipse 生成的代码相比,减少了很多boylerplate 代码(ALT+SHIFT +S --> H)。
我想知道是否可以更改 Eclipse 生成的 hashCode() 和 equals() 的默认行为?
我很想看到这个:
@Override
public int hashCode()
{
return Objects.hash(one, two, three, four/*, ...*/);
}
而不是这个:
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((one == null) ? 0 : one.hashCode());
result = prime * result + ((two == null) ? 0 : two.hashCode());
result = prime * result + ((three == null) ? 0 : three.hashCode());
result = prime * result + ((four== null) ? 0 : four.hashCode());
// ...
return result;
}
equals() 也是如此。 This is the article我是从那里得到的。
任何想法如何最好地实现这一点?
【问题讨论】:
-
对于“Generate toString()”,可以在向导页面上定义一个模板。你应该在eclipse-bugzilla 提交一张票,也许他们将来会为 eq+hashcode 添加类似的东西。如果你这样做了,请给票点个赞,让每个有兴趣的人都可以投票!
-
如果你不想看到
hashCode()函数,你也可以折叠它。我认为在未来所有可能的情况下考虑默认实现是否是您想要的可能是一个好主意。如果您想要/需要这样做,默认使用简写表达式,您将放弃调整hashCode的灵活性(当然不是不可逆转的)。有关散列函数的讨论,请参阅 stackoverflow.com/questions/12076846/…。 -
我已经记录了这个增强。为它投票! bugs.eclipse.org/bugs/show_bug.cgi?id=424214
-
2 年后,仍然没有任何改变。甚至没有对报告的错误发表评论。最好的解决方案是只使用 IntelliJ。
-
你也可以使用来自 apache commons 的 Builder:stackoverflow.com/a/22411032/644450
标签: java eclipse equals hashcode