Java 如何教eclipse从jdk 7对象类生成compact equals()和hashCode()?
几天前,我们在公司内部切换到了Java7——终于!Jay\o/所以我发现了Java 如何教eclipse从jdk 7对象类生成compact equals()和hashCode()?,java,eclipse,equals,hashcode,Java,Eclipse,Equals,Hashcode,几天前,我们在公司内部切换到了Java7——终于!Jay\o/所以我发现了对象类,并惊讶地发现hashCode()和equals()方法实现得如此之短,与eclipse默认生成的boylerplate代码相比(ALT+SHIFT+S-->H)减少了很多 我想知道是否可以更改eclipse生成的hashCode()和equals()的默认行为 我很想看到这个: @Override public int hashCode() { return Objects.hash(one, two, thr
对象
类,并惊讶地发现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()
。这是我从你那里得到的
如何最好地实现这一点,有什么想法吗?在Eclipse首选项中,转到Java>Editor>Templates 您可以在其中创建新模板。该模式可能看起来像:
@Override
public int hashCode()
{
return Objects.hash(one, two, three, four/*, ...*/);
}
但是,我不确定是否有一个变量可以正确地枚举字段
您可能想看看有一个新的插件可用,它可以使用java 7功能、apache公共语言库、guava库生成toString()、hashCode()、equals()方法。它有很好的自定义功能。请找到下面的链接来安装插件。 安装完成后,只需右键单击->Jenorate->其他选项
链接-
hashCode
和等于使用Java7Objects
类生成的代码,现在已经在Eclipse中实现。早在2018年8月,我就在处理功能请求,不久之后,我的贡献就被合并到JDT UI代码库中(请参见提交)
下面是Source>Generate hashCode()和equals中新选项的概述。。。工具:
这已于2018年9月在Eclipse 4.9中正式发布。只需下载最新版本的Eclipse(可以找到下载),或通过以下更新站点安装最新的可用软件:
除了这个新特性之外,阵列现在处理得更巧妙了。在许多情况下,生成将使用Arrays.deepHashCode
和Arrays.deepEquals
方法,在这些情况下,它以前会错误地选择标准数组.hashCode
和Arrays.equals
替代方法。对于“Generate toString()”可以在wizzard页面上定义模板。你应该在网站上提交一张罚单,也许将来他们会为eq+hashcode添加类似的内容。如果你这样做了,请给我一张喜欢的票,这样每个感兴趣的人都可以投票!如果不想看到,也可以折叠hashCode()
函数。我认为,在将来所有可能的情况下,考虑默认实现是否是您想要的是一个好主意。如果默认使用速记表达式,您将放弃灵活调整hashCode
(当然不是不可逆转的),如果您希望/需要这样做的话。有关哈希函数的讨论,请参阅。我已将此增强功能记录在日志中。投赞成票!2年后,仍然没有任何变化。甚至没有人对报告的bug发表评论。最好的解决方案是只使用IntelliJ。您也可以使用apache commons中的Builder:不幸的是,模板系统不支持枚举字段(类似于${Enclosuring_method_arguments},如果存在,可能是${Enclosuring_type_fields})。即使您编写了一个模板来自动生成样板文件,您仍然必须在hash()
方法中手动填写字段名。我不知道为什么hashCode和equals模板没有列在Java>CodeStyle>CodeTemplates中……不幸的是,这个插件有一个bug,如果你有一个超类,它不能正确生成hashCode和equals。