2011-12-15 3 views
0

私はint aとint bを持つスーパークラスを持っています。これらの変数は変更可能です。このスーパークラスには2つのメソッドがあり、そこから作成されたオブジェクトインスタンスのint aおよびint bの値を変更できます。2スーパークラス1の可変変数サブクラスの一意のID。 equalsメソッドとhashcodeメソッドをオーバーライドするのに最適な方法

私はスーパークラス(継承)から継承したサブクラスを持ち、スーパークラスには欠けていた改善された機能を追加するために2つのスーパークラスメソッドをオーバーライドします。サブクラスには1つのインスタンス変数があります。私は、スーパークラスとサブクラスの両方についてequalsメソッドとhashcodeメソッドのオーバーライドを示したかったのです。おそらく実行する必要はありませんが、私は が私の状況に合わせてどちらかまたは両方のクラスのequalsとhashcodeを上書きしたいと考えていました。

スーパークラスには一意のidインスタンス変数がありません。スーパークラスオブジェクトはユニークで、スーパークラスint aとint bをスーパークラスint aとint bのインスタンスと比較することによって、equalsメソッドとhashcodeメソッドでこれを示したかったのです。これは実現可能ですか?私は、比較される2つのオブジェクトのメモリ参照を使って等しいかどうかを比較するデフォルトのequalsメソッドを使用したくありませんでした。

また、EqualsメソッドでInt c(一意のID)、int aおよびint bをユニーク として使用して、サブクラスのオブジェクトを表示したかったのです。

スーパークラスのequalsとsubclassのequalsの両方のメソッドで等価チェックを行うことができますか、それともちょっと意味がありませんか?私はデフォルトのメモリ参照チェックを使用したくないが、2つの可変int変数(スーパークラス)と1つの一意のID(サブクラス)を使用して等価性または一意性を表示したかった。

私は、私はスーパークラスequalsをオーバーライドし、等価ルールが壊れていることを知っているサブクラスequals?

私はスーパークラスequalsメソッドとhashcodeメソッドをオーバーライドすることはできますが、それは私の状況に最適でしょうか?

任意の助けに感謝

+1

私は、あまりにも多くの情報と少し多すぎる質問がここにあると思います。私はあなたが何をしようとしているのか、問題が何かを本当に理解していません。いくつかのコードスニペットは、クラス間の相違点を概説することで、おそらく状況を明らかにする上で大きな助けになります。 –

+0

サブクラスでは、cは一意のIDだと言っていますが、同じcを持つ複数のインスタンスを作成することはできませんが、aやbが異なるチェックはありますか。そうでなければ、YourSubClassは、equals()とhashcode()の中で一意のキーであるcという概念を必要とするのはなぜでしょうか?そうでなければ、cが一意のキーであるという事実は、インデックスを付ける場合(Map 方法? –

答えて

0

二つの異なる哲学がここに基本的にあります。

a)のサブスーパーを拡張し、(sub.equalsので)とsub.hashCode()super.equalsへのデリゲート(両方) b)各クラスはそれ自身の契約執行を担当し、sub.equals()とsub.hashCode()はgetter(super.getXyz())を介して親フィールドを参照することで親フィールドを考慮します。

これらの方法はどちらも有効です。アプローチa)では、super.equals()はinstanceofの互換性をチェックし、アプローチb)ではsuper.equals()はthis.getClass()that.getClass()と比較します。アプローチa)の問題は、それがあなたに非対称equals()比較を与えることです。場合によっては、sub.equals(super)はfalseになりますが、super.equals(sub)はtrueになります。

詳細は、Effective Javaの項目8と9を参照してください。

+0

'instanceof'チェックを使うことは' equals'の対称性に違反する可能性が高いことに注意してください。 –