私の最近の質問で、自分のequals
andhashcode
メソッドを(とりわけ)オーバーライドする必要があるとのことでした。そのため、少し時間をかけていくつかの記事を読み、適切な実装を考え出そうとしました。
ここに私が読んだ記事のいくつかがあります:
どの記事もなかなか良かったです。これを試みるのはこれが初めてなので、単純な (またはばかげた) 間違いを犯していないことを確認したいだけです。
オブジェクトが別のオブジェクトと同等name
かどうかを示すために使用します。この理由は、他のすべての変数は異なる可能性がありますが、名前は常に一意になるためです。Person
Person
推奨される変更を反映するように更新
public class Person {
private String name;
private int p_number;
private String address;
//other variables
public Person(String a_name) {
name = a_name;
}
public String getName() {
return name;
}
//other getters and setters
@Override
public boolean equals(Object o) {
if(o == null)
return false;
if(o == this)
return true;
if(!(o instanceof Person))
return false;
Person p = (Person) o;
return name.equals(p.name));
}
@Override
public int hashCode() {
return name.hashCode();
}
}
私の質問は次のとおりです。
- これらのメソッドを正しく実装しましたか?
- 一意性を決定する唯一の変数であるため
name
、他の変数をわざわざチェックする必要がありますhashcode
か? - 少し前に 31 が適切な素数として選択されたことを StackOverflow で読んでいましたが、今はより大きな素数を選択する方が良いですか? 誰かがこの主張を肯定または否定できますか? (主張は上記の3番目のリンクで行われました)
これらのメソッドを適切に実装していない場合、どうすれば変更/改善できますか?