2017-10-13 9 views
0

Javaに組み込まれている契約チェックはありますか?ハッシュコードとequals関数の間​​の契約では?Javaの契約チェック - 内蔵ですか?例えば。ハッシュコード/等価

この質問では、例としてhashcode/equalsコントラクトを使用しますが、私は一般的な契約チェックに興味があります。私が等しくなる複数の場所で読んだことがあるし、ハッシュコードは、Javaでの「契約」を満たしている必要があります。

  • 等号
  • 等しいオブジェクトをequivalence relationの3つのルールに従わなければならないし、また、繰り返しの呼び出しに一致していなければならない同じハッシュコードを意味します

私は条件を理解しており、私には意味があります。しかし、私は疑問に思っています。これは単なる契約書ですか?開発者がバグのコードを書かないように強く指針していますか?それとも、Javaによってコンパイル時または実行時の例外として捕捉されるものでしょうか?

+1

コンパイル時または実行時の例外としてJavaで捕捉されることはありません。あなたは責任を負いません。あなたは、これらの契約をチェックする単体テストを作成します。 (コードを書いている)contに従うラクト。 – nbokmans

+0

同じであれば、同じハッシュコードを意味するわけではありませんが、あなたはいくつかの奇妙な動作を得ることができます。例えば。同じオブジェクトをハッシュマップ内の異なるバケットにマップすることができます。 –

+0

ありがとうございました - それは私が思ったものです。だから、基本的には、Javaが本当に恐ろしいとバグになるコードを書かないようにJavaの強力なガイドラインです...しかし、理論的には、契約に違反するプログラムを書くことができ、何年もの間、明らかになった。 –

答えて

1

コンパイル時に強制されません。

クラスによっては、実行時に動作を強制することがあります。たとえば、等しい2つのオブジェクトが同じハッシュコードを持つか、例外を送信するかをチェックするメソッドを記述できます。

また、お勧めの契約から逸脱したがっている可能性があります。

+0

ありがとうございます。私は本当にこの契約からの逸脱が実際に望まれる例を見ることに興味がありますか? –

+0

例えば、 'Comparable'は' compareTo'が 'equals'と一貫性があることを強くお勧めします(つまり' a.compareTo(b)== 0)==(a.equals(b) ')。 https://stackoverflow.com/a/14534751/829571 – assylias

1

それはあなたが明示的にそれをチェックしている場合を除いて(ではない(とすることはできません)、コンパイルや実行時に自動的に巻き込ま

シンプルなカウンター例:。

public boolean equals(Object other){ 
    return new Random().nextInt(3) == new Random().nextInt(3); 
} 

public int hashCode() { 
    return new Random().nextInt(3); 
} 

それが良いアイデアですが

+0

ええ、私はそれについてもっと考えると、これが自動的にキャッチされないことが分かります。私は、コンパイル時にこの契約違反をチェックしようとするフレームワークがあるのだろうかと思っています。興味深いプロジェクトでしょうか。 –

+1

その方向で何かに興味があるなら、https: //en.wikipedia.org/wiki/Java_Modeling_Language –

+0

Nice!非常に面白いです。これは、少なくともHoareトリプルのような方法でこれらの連絡先を自然な方法で指定できるように見えますが、これは実行時アサーションに変換されます。私は、JML仕様のコンパイル時にYES/NOの答えを与えることができる一般的なツールを書くことは可能だろうと考えています。おそらくコンピューターサイエンスのこれらの一般的な事のほとんどのように決めることはできません。とにかく、とても面白いです。ウィッシュ業界はこれをより多く使用していました。 –

関連する問題