2012-04-09 6 views
6

以下のコードは、equals()メソッドとhashcode()メソッドをオーバーライドしています。ここgettersはequalsとhashcodeで使用できますか?

public boolean equals(Object obj) 
{ 
    if (obj == null) 
    return false; 
    if (!(obj instanceof Name)) 
    return false; 
    Name name = (Name) obj; 
    return this.name.equals(name.name); 
} 

public int hashCode() 
{ 
    return name.hashCode(); 
} 

私は2行の下に置き換えることができます。

return this.getName().equals(name.getName()); 
return getName().hashCode(); 

return this.name.equals(name.name); 
return name.hashCode(); 

私の代わりにプロパティを使用しての意味私は直接等しいとhashCodeメソッドの内部ゲッターを使用することができますか?

ありがとうございます!

+0

なぜですか?:) –

+0

はい、問題はありません。 – MJM

+0

はい。オブジェクトがコレクション内にあるときに変更できるセッターやフィールドは使用できません。 –

答えて

1

あなたはどうでしょうか?オプションA:コンパイラはそれをインライン展開するので、結果的にはフィールドへの参照になります。オプションB:コンパイラは呼び出しをインライン化しません。つまり、追加のメソッド呼び出しを1つ導入しました。

可読性にも影響があります。nameフィールドがクラス内で直接アクセスできる場合は、直接参照してください。私はこれを読むのが簡単だと思っていますが、一部の人々はそれが矛盾していると感じています。

+0

小さなメモとして。 Mokitoを使用し、equalsで使用されているgetterの1つをモックし、equalsメソッドがfinalであれば、無限ループ地獄に行きます。 Mokitoはフィールドをモックするために内部的にequalsを使用します。通常、これはあなたを上書きしますが、最終としてマークされている場合StackoverflowErrorを返します – Lori

3

はい必ずこれを使用することができ、

hashcode()equals()は、フィールド・メソッドは、彼らが直接プライベートメンバにアクセスすることができ、ですが、どのような場合は、アクセサメソッドに包まれた、いくつかのロジックがあるので、アクセスを常に安全ですアクセサーメソッドを使用するフィールド

0

はい、どうしてできないのですか?

将来、このようなことで、試してみることをおすすめします。

0

はいできます。何故なの?あなたの疑問は何ですか?

1

はい、equals() & hashCode()の実装ではゲッターを使用することを強くお勧めします。私の知る限りでは、これはどんな方法でもあなたを害することはありません。

ゲッターを使用しないでequals()を実装すると、2つのプロキシオブジェクトを比較するときに正しい結果が得られません。

例:、あなたの根本的な休止状態DAOによって返された2つのプロキシオブジェクトを比較しようとした場合、あなたは彼らが同じオブジェクトだにもかかわらず、あなたのequals()方法からを受けることは決してないだろう。

更新

使用getterメソッドの代わりに直接アクセスします。これは、 オブジェクトインスタンスが他のオブジェクトとして渡されたため、実際の インスタンスではなく、プロキシオブジェクトになるためです。このプロキシを初期化するには、 getterメソッドを使用してこのプロキシにアクセスする必要があります。

これはEffective Javaの抜粋です。詳細については、thisを参照してください。

+0

これは古いquesionですが、これはプロキシでの作業に役立つと確信しています。 – Diablo

関連する問題