1

私は User example を使用した私の実装のために、equals と hashcode を実証するためにいくつかのコードを書いています:

public class User {
    private String name;
    private String pass;
    //...
    @Override
    public boolean equals(Object obj) {
        if (obj == null) { return false; }
        if (obj == this) { return true; }
        if (obj.getClass() != this.getClass()) {
            return false;
        }
        User rhs = (User) obj;

        EqualsBuilder eb = new EqualsBuilder();
        eb.append(this.getName(), rhs.getName());
        //eb.append(this.getPass(), rhs.getPass());
        return eb.isEquals();
    }
    @Override
    public int hashCode() {
        HashCodeBuilder hcb = new HashCodeBuilder(17, 37);
        hcb.append(this.getName());
        hcb.append(this.getPass());
        return hcb.toHashCode();
    }
    //...
    public static void main(String[] args) {

        User u1 = new User("foo","foo1");
        User u2 = new User("bar","bar1");
        System.out.println(u1.equals(u2));
        System.out.println(u1.hashCode() + " ?= " + u2.hashCode());
        User u3 = new User("foo","foo1");
        User u4 = new User("foo","bar1");
        System.out.println(u3.equals(u4));
        System.out.println(u3.hashCode() + " ?= " + u4.hashCode());

    }
}

出力:

false
2128613651 ?= 2129111967
true
2128615478 ?= 2214545177

オブジェクトが等しい可能性がありますが、ハッシュコードが異なるため(これは悪いことです)、間違っていると思いますが、名前も等しい場合にのみユーザーを等しくしたい.. name AND pass equals.

慣習を尊重し、達成したいことを達成するにはどうすればよいですか? あなたの助け/説明をありがとう:)

4

3 に答える 3

4

一般的に言えば、フィールドがメソッドに存在しない場合、equals()メソッドでそれを参照するべきではありませんhashCode()

これにより、hashcode()結果が頻繁に変化することがなくなりますequals()。メソッドを次のように変更することを検討してください。

@Override
public int hashCode() {
    HashCodeBuilder hcb = new HashCodeBuilder(17, 37);
    hcb.append(this.getName());
    return hcb.toHashCode();
}

そうは言っても、非直感的なequals()方法を作成することはほとんど良い考えではありません。将来のメンテナーの多くがそうであるように、あなたの方法もパスワードを考慮すると当然思います。真の等価性テストを実施しないと、単体テストを書くのが難しくなる可能性があります。独自のメソッドを作成する方がよいかどうかを検討してください。

public boolean usernameEquals(User other) {
  ...
}
于 2014-08-12T09:46:49.500 に答える
0

等しいすべてのオブジェクトは、同じハッシュコードを持ちます。しかし、同じハッシュコードを持つすべてのオブジェクトが等しいわけではありません。

hascode メソッドで使用するすべてのフィールドは、equals メソッドで使用する必要があります。

于 2014-08-12T09:44:38.013 に答える
0

あなたのやり方が間違っているとは言いません。コントラクトに関する限り、2 つのオブジェクトが等しい場合、それらは同じ hashCode を持つ必要があります。2 つのオブジェクトが同じ hashCode を持つ場合、それらは等しい必要はありません

2 つの User インスタンスの等価性を次のように定義した場合 - They are equal, if their names are equal , その後、問題ありません。hashCodes に関する限り、2 つのオブジェクトの hashCodes が等しくない場合、オブジェクトは等しくないため、そのとおりです。

ところで、 Duncanは、非直感的な equals() メソッドを作成することはめったに良い考えではないことを指摘する点で完全に正しいです。

于 2014-08-12T09:46:06.220 に答える