7

そのため、多くのカスタム クラスには、コンポジションを使用して内部にカスタム クラスも含まれています。

カスタム クラスには頻繁に変更される変数があり、それらを HashSets に追加します。私の質問は、hashCode を実装するときです。常に変化するプライベート フィールドしか持たないクラスに対してはどうすればよいでしょうか。

カスタム クラスの例を次に示します。

public class Cell {
    protected boolean isActive;
    protected boolean wasActive;

    public Cell() {
    this.isActive = false;
    this.wasActive = false;
    }

    // getter and setter methods...

    @Override
    public int hashCode() {
    // HOW SHOULD I IMPLEMENT THIS IF THIS custom object is constantly
        // being added into HashSets and have it's private fields isActive
        // and wasActive constantly changed.
    }

    // ANOTHER QUESTION Am I missing anything with this below equals implementation?
    @Override
    public boolean equals(Object object) {
    boolean result = false;
    if (object instanceof Cell) {
        Cell otherCell = (Cell) object;
        result = (this.isActive == otherCell.isActive && this.wasActive == 
            otherCell.wasActive);
    }
    return result;
    }
4

3 に答える 3

6

Java での Equals および hashCode 契約:

equals() メソッドをオーバーライドする場合は、hashCode() をオーバーライドする必要があります。Java の equals メソッドは、以下に示すように、Java の hashCode メソッドとの契約に従う必要があります。

  1. equals() メソッドで 2 つのオブジェクトが等しい場合、ハッシュコードは同じでなければなりません。
  2. equals() メソッドで 2 つのオブジェクトが等しくない場合、ハッシュコードが同じか異なる可能性があります。

これらは、クラスの equals および hashcode メソッドのサンプル実装です。

 //Hashcode Implementation    

   @Override
    public int hashCode() 
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + (isActive ? 1231 : 1237);
        result = prime * result + (wasActive ? 1231 : 1237);
        return result;
    }

//equals Implementation    
    @Override
    public boolean equals(Object obj) 
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Cell other = (Cell) obj;
        if (isActive != other.isActive)
            return false;
        if (wasActive != other.wasActive)
            return false;
        return true;
    }
于 2013-07-23T04:54:33.890 に答える