非常に多くの場合hashcode()
、equals()
単に機能しない OO コードベースがあります。主な理由は次のとおりです。
オブジェクト指向の抽象化の利点を諦めない限り、インスタンス化可能なクラスを拡張して値コンポーネントを追加する方法はありません。
これは、Joshua Bloch による「Effective Java」からの引用であり、このテーマについては、次の Artima の優れた記事で詳しく説明しています。
http://www.artima.com/lejava/articles/equality.html
これは、この質問の目的ではありません。
問題は、場合によっては契約を満たすことができないという事実があることがわかった場合、UnsupportedOperationExceptionを自動的に作成してスロー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()
、Java 階層の最上位にあり、場合によっては意味がありません。では、この問題をきれいに処理するにはどうすればよいでしょうか。