相关疑难解决方法(0)

Java:调用hashCode()和equals()时自动抛出UnsupportedOperationException的干净方法?

我们有一个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()和 …

java design-by-contract equals

14
推荐指数
3
解决办法
6967
查看次数

标签 统计

design-by-contract ×1

equals ×1

java ×1