-2

ハッシュ コード ビルダーを pojo のインスタンス変数として使用しています。

public class Pojo {
private HashCodeBuilder hashBuilder = new HashCodeBuilder(); 
private int i;
public setI(int i) {this.i = i}

@Override
public int hashCode() {           
    hashBuilder.append(id);        
    return hashBuilder.toHashCode();
}
}

の値を同じ値に 2 回設定するiと、ハッシュコードの結果が異なります。これは実装上のバグですか?

ハッシュ コード ビルダーが実行中の合計を保持するために発生していることを理解しています。しかし、同じ値のセットに対して同じハッシュを与えるべきではありませんか?

また、上記のアプローチに従わない場合、次のようにhashcodepojo のメソッド内で同じハッシュ コード ビルダーを何千回も初期化することになります。

...
@Override
public int hashCode() {   
    hashBuilder = new HashBuilder();        
    hashBuilder.append(id);        
    return hashBuilder.toHashCode();
}
...

この実行中の合計をリセットして、同じ値のセットで呼び出すたびにhashcode一貫した回答が得られるようにする方法はありますか?

4

1 に答える 1

1

あなたがそれをしている方法は、あなたがid呼び出すたびに別のものを追加していますhashCode()append()は値 (フィールド名ではありません!) を受け入れるため、2回HashCodeBuilder追加idしたかどうか、または同じ値を持つ別のフィールドがあるかどうかを知る方法がありません。

HashCodeBuilderで をローカルに作成しますhashCode()。アプリケーションのプロファイリングを行い、それが影響することを証明しない限り、パフォーマンスに重大な影響を与えると想定しないでください (つまり、時期尚早の最適化を回避します)。

HashCodeBuilder本当にon eachの不必要な作成を避けたい場合は、setterhashCode()の変更を追跡し、setter を介して値が変更されるたびにhashCodeBuildertoを設定する必要があります。null必要に応じて使用しhashCode()ます。次に、すべてのフィールド変更がセッターを通過することを確認する必要があります。非常に多くの作業と多くのことがうまくいかない可能性があるため、可能であれば、これらすべてを回避したいと考えています。

于 2016-12-12T11:14:08.137 に答える