【问题标题】:Automatically generating equals and hashCode in Eclipse that is aware of @NonNull annotations在知道 @NonNull 注释的 Eclipse 中自动生成 equals 和 hashCode
【发布时间】:2011-05-20 02:23:10
【问题描述】:

有没有办法配置 Eclipse 以自动生成 hashCode 和 equals 并感知 @NonNull 注释?目前,我的 Eclipse 使用不必要的 null 检查生成代码,即使在标记为 @NonNull 的字段上也是如此。


请注意,FindBugs 会发出 these null checks are redundant 的警告。当然我们可以添加 @edu.umd.cs.findbugs.annotations.SuppressWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") 的方法,但这似乎首先破坏了 FindBugs 和 @NonNull 的作用。

在我看来,最好的解决方案是让 Eclipse 了解 JSR 305 并相应地生成 equals 和 hashCode 而不进行 null 检查(如果它们是 null 无论如何,那就这样吧,让一个NullPointerException被自然抛出,因为发生了违约)。

除此之外,能够自定义 Eclipse 生成的 equals 和 hashCode 模板也不错。

相关问题

【问题讨论】:

  • +1“让 Eclipse 了解 JSR 305”和/或“有办法自定义 Eclipse 生成的 equals 和 hashCode 模板也不错”

标签: java eclipse null equals jsr305


【解决方案1】:

我认为那些空检查是不是不必要的。如果它们被排除在外,那么equals 和hashcode 将在未通过验证的对象上表现异常,这将导致各种问题。

跟进

如果你仍然要在任何地方检查 null,那么 @NonNull 注释有什么用呢?

注释的重点是声明一个有效实例在该属性中没有null,并允许基于该声明实现验证机制。

但是,没有什么要求实例始终有效。事实上,如果是这样的话,那么在创建实例并将实例链接在一起时,您会遇到各种实现问题(例如)。

【讨论】:

  • 那么,如果您仍然要到处检查null,那么@NonNull 注释有什么用呢?
  • 我支持@poly - 这些字段注释用于表达代码中的约束并使那些空检查变得多余。至少,它们应该是断言。如果我有一个字段 private int age 应该始终是非负的,并且我的实现确保它始终是非负的,我是否还应该在任何地方添加检查以确保我的实现保持其承诺?我应该在每个方法开始时检查每个 ivar 的每个约束吗?
  • 这包含在stackoverflow.com/questions/271526/… 中关于信任合约的答案/评论中,但这是一个更强大的合约/“承诺”,因为它是设计/类设计师做出承诺而不是客户类。
  • 这很好......直到您的 equals 方法开始抛出 NPE,因为您正在比较尚未验证或验证失败的对象。 @NotNull 注释是声明该字段不应为空,而不是它不会为空的合同。如果约束注释是契约,那么就没有必要调用 Validator.validate ...。
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 2016-05-05
  • 2012-09-16
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多