【问题标题】:How to teach eclipse to generate compact equals() and hashCode() from the jdk 7 Objects class?如何教 eclipse 从 jdk 7 Objects 类生成紧凑的 equals() 和 hashCode()?
【发布时间】: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


【解决方案1】:

hashCodeequals 生成使用 Java 7 Objects 类现已在 Eclipse 中实现。早在 2018 年 8 月,我就在处理功能请求 424214,不久之后我的贡献被合并到 JDT UI 代码库中(参见提交 f543cd6)。

以下是 Source > Generate hashCode() and equals... 工具中新选项的概述:

它已于 2018 年 9 月在 Eclipse 4.9 中正式发布。只需下载最新版本的 Eclipse(可在here 找到下载),或通过以下更新站点安装最新可用软件: http://download.eclipse.org/releases/latest

除了这个新功能之外,现在可以更巧妙地处理数组。这一代将在许多情况下使用Arrays.deepHashCodeArrays.deepEquals 方法,在这些情况下,它以前错误地更喜欢标准的Arrays.hashCodeArrays.equals 替代方案。

【讨论】:

    【解决方案2】:

    在 Eclipse 首选项中,转到 Java > Editor > Templates。

    您可以在其中创建一个新模板。该模式可能如下所示:

    @Override
    public int hashCode()
    {
         return Objects.hash(one, two, three, four/*, ...*/);
    }
    

    我不确定是否有一个变量可以正确枚举您的字段。

    你可能想看看some further explanations on these templates

    【讨论】:

    • 不幸的是,模板系统不支持枚举字段(类似于 ${enclosure_method_arguments},它可能是 ${enclosing_type_fields} 如果它存在)。即使您编写了一个模板来自动生成样板,您仍然需要手动填写 hash() 方法中的字段名称。而且我不知道为什么 Java > Code Style > Code Templates... 中没有列出 hashCode 和 equals 模板
    【解决方案3】:

    有一个新插件可用,它可以使用 java 7 特性、apache 通用语言库、番石榴库生成 toString()、hashCode()、equals() 方法。它具有良好的可定制功能。请找到下面的链接以安装插件。 安装好后,右键-> Jenerate -> 不同的选项

    链接 - https://marketplace.eclipse.org/content/jenerate

    【讨论】:

    • 不幸的是,这个插件有一个错误,如果你有一个超类,它不会生成 hashCode 并且正确地等于。
    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多