将Java类注释为安全的引用比较

7

我有一个多例模式的类,所以我知道给定特定的键,同一个类的两个实例永远不会存在。这意味着,不需要:

if (someObject.equals(anotherObject))

我可以安全地执行这个操作:

if (someObject == anotherObject)

这个类也是final的,因此我知道与多态有关的任何问题都不会对比较造成问题。

IDEA认真地告诉我直接比较两个实例是有风险的,我应该使用.equals(),但在这种情况下我知道它是不必要的。是否有一些注释可以应用于我的类来指示IDEA,以及其他编辑器和更重要的其他用户,在我的类的实例上进行直接引用比较是安全的?

我知道我可以告诉IDEA抑制警告,但我必须为这两种类型之间的每个比较或全局执行此操作,这两种方法都不是一个好主意。此外,更重要的是让我的类的用户知道它是安全的、更快的,甚至是首选(说服我否则)而不是使用.equals()


哦,序列化或其他花招在这里不适用。该对象仅由我构造,而不是通过其他方式(如反序列化)意外地构造。这是一个GWT应用程序,这也意味着与多线程相关的任何内容也不适用。 - user3466413
6
我会尝试为.equals进行辩论:如果你只让.equals引用引用相等,它应该会优化成==,而用户就不必记住有些对象可以使用==,而有些不能。他们可以在任何地方都使用.equals,它的性能和==一样好。 - Louis Wasserman
1
不错!你已经对那些事情小心谨慎了。按照意图工作。当传递了一个本不应该出现 null 的值时,NullPointerException是合适的结果。 - Louis Wasserman
2
еҪ“дҪ дҪҝз”ЁObjects.equals(a, b)ж—¶пјҢе…¶дёӯObjectsжҳҜjava.util.ObjectsгҖӮ - Louis Wasserman
2
我 +1 @LouisWasserman: 为了保险起见,您可以添加最终的equals实现,只需调用super(或执行引用相等性),并防止最终子类覆盖。 - benzonico
显示剩余4条评论
1个回答

1
IntelliJ的检查功能有一个选项:"忽略只有私有构造函数类型的对象之间的'=='"。如果我理解正确,启用此选项将关闭您的情况下的突出显示。
目前在IntelliJ IDEA中没有通过注释忽略==比较的可能性。

感谢您的IDEA配置建议。是否有一种方法可以添加一些元数据到类中,以便使用Eclipse或其他编辑器的人也知道比较是安全的? - user3466413
对于通用文本编辑器而言,无法向类定义中添加任何元数据,以便类的用户可以看到它。至于 Eclipse,我不太熟悉它,无法告诉您具体情况。 - yole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接