おっしゃる通り、hashcode()をオーバーライドしていないことが規約に違反する原因の1つですが、もう1つ、
MyStuff以外のインスタンスが渡ると例外になってしまう
という点で問題があります。
ごめんなさい。それ以前に大きな問題がありました。
このequalsメソッドは引数をMyStuffにキャストしたときに、引数に名前があるか否かだけで判定しています。
そのため、
- 名前がnullのMyStuffを作ると、自分自身にfalse判定を出してしまう(反射性違反)
java
1MyStuff x = new MyStuff(null);
2System.out.println(x.equals(x)); //反射性によりtrueを返すべきだが、falseになる
- 名前がnullと非nullのインスタンスを作って比較すると、x.equals(y)とy.equals(x)の結果が一致しない(対称性違反)
java
1MyStuff x = new MyStuff("name");
2MyStuff y = new MyStuff(null);
3System.out.println(x.equals(y)); //yの名前がnullによりfalse
4System.out.println(y.equals(x)); //xの名前がnullでないためtrue
という問題があります。
Object#equals
通常、このメソッドをオーバーライドする場合は、hashCodeメソッドを常にオーバーライドして、「等価なオブジェクトは等価なハッシュ・コードを保持する必要がある」というhashCodeメソッドの汎用規約に従う必要があることに留意してください。
ハッシュコードの話はequalsではなくhashCodeの汎用規約でした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/17 22:49 編集
2017/05/17 22:51
2017/05/17 22:56
2017/05/18 10:43