Java:在调用 hashCode() 和 equals() 时自动抛出 UnsupportedOperationException 的干净方法?
我们有一个OO代码库,在很多情况下根本不起作用,主要是因为以下原因:hashcode()
equals()
没有办法在保留 equals 协定的同时扩展可实例化类并添加值组件,除非你愿意放弃面向对象抽象的好处。
这是Joshua Bloch的“Effective Java”中的一句话,在Artima的一篇很棒的文章中有更多关于这个主题的内容:
http://www.artima.com/lejava/articles/equality.html
我们对此完全没问题,这不是这个问题的意义所在。
问题是:看到在某些情况下您无法满足合同是事实,那么自动制作和抛出不支持的操作异常的干净方法是什么?equals()
hashcode()
equals()
注释是否有效?我正在考虑这样的事情:每次违反契约都会自动引发异常,除了用 注释参数/返回值之外,您没有其他事情可做。@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" );
}
然而,这很容易出错:我们可能会错误地忘记剪切/粘贴它,这可能会导致用户滥用这些对象(例如,尝试将它们放在默认的Java集合中)。
或者,如果无法进行注释以创建此行为,AOP 是否有效?
有趣的是,真正的问题是Java层次结构的存在和顶端的存在,这在某些情况下根本没有意义。但是,我们如何干净利落地处理这个问题呢?hashCode()
equals()