私のプログラムで.equals(Die aDie)メソッドを作成しています。静的変数を含むすべてのインスタンス変数を比較しますか?.equals(Die aDie)メソッドと静的変数の実装
答えて
静的変数は、インスタンス変数ではないため、同じクラスのすべてのインスタンスで常に等しくなります。
すべてのインスタンス変数を比較します。
静的変数は、インスタンス固有のものではなくクラス固有のものであることが保証されているため、それらを比較することについて心配する必要はありません。
静的なものではありません。
すべてを比較するかどうかは、インスタンス変数はオブジェクトの「同一性」を決める条件、つまりそれらをいつ等しいと考えますか?これは、特定のアプリケーションのコンテキストでのみ決定できます。詳細情報が必要です。
たとえば、書籍を表すクラスがあった場合、それらのメタデータ(タイトル、著者)を保存するだけの場合は、ISBN番号を比較して2つの書籍が同じ本であるかどうかを判断できます。このようなデータベースを2つマージした場合は、重複したレコードを削除する必要があります。
しかし、実際の物理書籍のライブラリカタログを実装していた場合は、個々のコピーが重要で異なるため、ISBN とのコピーナンバーを比較することができます。 2つのライブラリをマージした場合、重複したコピーを検出できることが期待されます。
equals()でインスタンスとを比較すると、それは静的であるため、どちらも意味がありません。
Die
クラスのすべてのインスタンスで共有されるため、静的データを比較するのは無意味です。しかし、それらのフィールドに直接アクセスすることで、さまざまなフィールドを比較することができます(下記の例を参照)。 Die
オブジェクトに複雑なフィールド(例:Map
,Set
など)がある場合は、これらのオブジェクトのequals
メソッドも呼び出す必要があります(やはり以下の例を参照してください)。
あなたがequals()
方法を提供したい場合は、Object
クラス(equals (Object anOtherObject
)で提供される一つではなく、それをオーバーロード、または少なくともあなたも、それが正しい値を返すことを確認するためにequals (Object anOtherObject)
を上書きすることを確認してくださいをオーバーライドする必要があります(デフォルトの実装では、同じインスタンスかどうかだけをチェックします)。そしてあなたの方法では、anOtherObject
がDie
のインスタンスであるかどうかを確認する必要があります。 String name
、int value
とMap<Integer> complexField
:
はここにあなたのDie
クラスは3つのフィールドを持っていると仮定して、例です
public boolean equals (Object anOtherObject) {
if (anOtherObject == this) {
return true;
}
if (!anOtherObject instanceof Die) {
return false;
}
Die otherDie = (Die) anOtherObject;
if (this.value != otherDie.value ||
!this.name.equals (otherDie.name) ||
!this.complexField.equals (otherDie.complexField)) {
return false;
}
return true;
}
ジョシュブロッホの「効果的なJavaのが」正しくequals
を実装する方法について非常に詳細セクションを持っています。あなたは間違いなくそれを読むべきです。
ブール等号(ADIEダイ)
が間違っている、クラスはequals(Object)
メソッドを呼び出すと、あなたのequals(ダイ)を無視します。また、(Object)と同じフィールドを使用してint hashCode()
メソッドを実装します。
@Override public boolean equals(Object aDie){
if(aDie == null || aDie.getClass() != Die.class)return false;
if(aDie == this)return true;
Die other = (Die)aDie;
...
}
@Override public int hashCode(){
...
}
スタティックフィールドはすべてのダイで同じなので無視できます。
変数がキーワード "static"で宣言されている場合、その変数は "クラス変数"と呼ばれます。すべてのインスタンスは同じ変数のコピーを共有します(常に同じクラスのすべてのインスタンスで等しい)。インスタンスを作成する必要はなく、クラス変数に直接アクセスできます。
- 1. 静的メソッドと静的変数のjava
- 2. Equalsメソッド実装ヘルパー(C#)
- 3. 静的メソッドと変数
- 4. 静的メソッドとスレッドセーフティのローカル変数
- 5. equalsメソッドを再帰的に実装する
- 6. 静的クラスで非静的メソッドを実装する方法は?
- 7. Rubyのメソッドの静的ローカル変数?
- 8. 静的メソッドから非静的メンバー変数へのアクセス
- 9. 静的メソッド内のローカル変数は、静的ていますか?
- 10. 関数内静的変数と静的クラス変数の比較
- 11. 静的クラスと静的メソッド
- 12. パブリック静的変数とプライベート静的変数の違い
- 13. 関数と静的メソッドとの比較
- 14. 静的メソッドを実装する - 援助が必要
- 15. ユーザーに静的メソッドを実装させる
- 16. 静的メソッドで静的メソッドと非静的メソッドにアクセスする方法
- 17. ガベージコレクタと静的クラス、変数
- 18. 静的変数とメンバ
- 19. 可変パラメータスレッドセーフな静的メソッド?
- 20. 静的変数
- 21. IIS 7.5の静的変数と長時間実行スレッド
- 22. 静的メソッドと非静的メソッドの同期ブロック
- 23. Java generics - 静的メソッドが実装されていることを確認する
- 24. 静的変数または静的メソッドを実行するためのJava注釈?
- 25. C#の静的メソッドとコンソール
- 26. キーワードとEqualsメソッドのオーバーライド「が」
- 27. 複数の実装を静的ライブラリに展開する
- 28. プライベート静的メソッドを使用して静的変数を初期化する
- 29. 不変性と静的変数
- 30. C++静的変数。
どれが良いですか? – malhobayyeb
インスタンス変数のみ。 'Die.sides'が静的である場合、' Die a.sides'と 'Die b.sides' **を比較することは決して偽ではありません。統計の値とメモリの位置は同じです。 –
なぜdownvote? –