我们有一个OO代码库,在很多情况下hashcode()并且equals()根本不起作用,主要是由于以下原因:
除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件.
这是Joshua Bloch撰写的"Effective Java"的引用,在这篇伟大的Artima文章中有关于该主题的更多内容:
http://www.artima.com/lejava/articles/equality.html
我们完全没问题,这不是这个问题的意思.
问题是:看到事实上,在某些情况下你无法满足equals()合同,什么是自动制作hashcode()和equals()抛出UnsupportedOperationException 的干净方法?
注释会起作用吗?我正在考虑这样的事情@NotNull:每次@NotNull合同违规都会自动抛出异常,除了用你的参数/返回值注释之外别无他法@NotNull.
它很方便,因为它是8个字符("@NotNull")而不是不断重复相同的验证/抛出异常代码.
在我关注的情况下,在每个hashCode()/equals()没有意义的实现中,我们总是重复同样的事情:
@Override
public int hashCode() {
throw new UnsupportedOperationException( "contract violation: calling hashCode() on such an object makes no sense" );
}
@Override
public boolean equals( Object o ) {
throw new UnsupportedOperationException( "contract violation: calling equals() on such an object makes no sense" );
}
Run Code Online (Sandbox Code Playgroud)
然而,这很容易出错:我们可能会忘记剪切/粘贴此内容,这可能会导致用户滥用此类对象(例如,尝试将它们放入默认的Java集合中).
或者,如果无法创建注释来创建此行为,AOP是否有效?
有趣的是,真正的问题是Java层次结构的存在hashCode()和 …