2012-02-28 12 views

答えて

2

静的変数は、インスタンス変数ではないため、同じクラスのすべてのインスタンスで常に等しくなります。

0

すべてのインスタンス変数を比較します。

静的変数は、インスタンス固有のものではなくクラス固有のものであることが保証されているため、それらを比較することについて心配する必要はありません。

+0

どれが良いですか? – malhobayyeb

+0

インスタンス変数のみ。 'Die.sides'が静的である場合、' Die a.sides'と 'Die b.sides' **を比較することは決して偽ではありません。統計の値とメモリの位置は同じです。 –

+0

なぜdownvote? –

1

静的なものではありません。

すべてを比較するかどうかは、インスタンス変数はオブジェクトの「同一性」を決める条件、つまりそれらをいつ等しいと考えますか?これは、特定のアプリケーションのコンテキストでのみ決定できます。詳細情報が必要です。

たとえば、書籍を表すクラスがあった場合、それらのメタデータ(タイトル、著者)を保存するだけの場合は、ISBN番号を比較して2つの書籍が同じ本であるかどうかを判断できます。このようなデータベースを2つマージした場合は、重複したレコードを削除する必要があります。

しかし、実際の物理書籍のライブラリカタログを実装していた場合は、個々のコピーが重要で異なるため、ISBN のコピーナンバーを比較することができます。 2つのライブラリをマージした場合、重複したコピーを検出できることが期待されます。

0

equals()でインスタンスを比較すると、それは静的であるため、どちらも意味がありません。

0

Dieクラスのすべてのインスタンスで共有されるため、静的データを比較するのは無意味です。しかし、それらのフィールドに直接アクセスすることで、さまざまなフィールドを比較することができます(下記の例を参照)。 Dieオブジェクトに複雑なフィールド(例:Map,Setなど)がある場合は、これらのオブジェクトのequalsメソッドも呼び出す必要があります(やはり以下の例を参照してください)。

あなたがequals()方法を提供したい場合は、Objectクラス(equals (Object anOtherObject)で提供される一つではなく、それをオーバーロード、または少なくともあなたも、それが正しい値を返すことを確認するためにequals (Object anOtherObject)を上書きすることを確認してくださいをオーバーライドする必要があります(デフォルトの実装では、同じインスタンスかどうかだけをチェックします)。そしてあなたの方法では、anOtherObjectDieのインスタンスであるかどうかを確認する必要があります。 String nameint valueMap<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を実装する方法について非常に詳細セクションを持っています。あなたは間違いなくそれを読むべきです。

4

ブール等号(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(){ 
    ... 
} 

スタティックフィールドはすべてのダイで同じなので無視できます。

0

変数がキーワード "static"で宣言されている場合、その変数は "クラス変数"と呼ばれます。すべてのインスタンスは同じ変数のコピーを共有します(常に同じクラスのすべてのインスタンスで等しい)。インスタンスを作成する必要はなく、クラス変数に直接アクセスできます。

関連する問題