7

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.name.equals(name.name);
return name.hashCode();

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

つまり、プロパティを使用する代わりに、equalsメソッドとhashcodeメソッド内でゲッターを直接使用できますか?

ありがとう!

4

5 に答える 5

4

はい、これを使用できます。

hashcode()equals()はフィールドメソッドです。プライベートメンバーに直接アクセスできますが、アクセサメソッドでラップされたロジックがある場合はどうなるので、アクセサメソッドを使用してフィールドにアクセスするのは常に安全です。

于 2012-04-09T10:52:57.600 に答える
3

はい、equals() & hashCode()実装にゲッターを使用することを強くお勧めします。そして私の知る限り、これは決してあなたに害を及ぼすことはありません。

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

例:基になる休止状態のdaoによって返される2つのプロキシされたオブジェクトを比較しようとすると、それらが同じオブジェクトであっても、メソッドからtrueを受け取ることはありません。equals()

アップデート

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

詳細については、これを確認してください。

于 2016-11-09T15:00:53.177 に答える
2

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

読みやすさにも影響がありnameます。クラス内でフィールドに直接アクセスできる場合は、直接参照してみませんか?これは読みやすいと思いますが、一貫性がないと感じる人もいます。

于 2012-04-09T11:00:05.383 に答える
0

はい、なぜあなたはできないのですか?

将来的には、こういうことで、ぜひ試してみることをお勧めします。

于 2012-04-09T10:52:59.067 に答える
0

はい、できます。なぜだめですか?あなたの疑問は何ですか?

于 2012-04-09T10:54:35.900 に答える