何をしたいかによります。同じandを持つ2 つの異なるEventInfo
インスタンスが2 つの異なるキーになる場合、 andを実装する必要はありません。name
info
equals
hashCode
そう
EventInfo info1 = new EventInfo();
info1.setName("myname");
info1.setInfo(null);
EventInfo info2 = new EventInfo();
info2.setName("myname");
info2.setInfo(null);
info1.equals(info2)
は false をinfo1.hashCode()
返し、別の値を に返しますinfo2.hashCode()
。
したがって、それらをマップに追加する場合:
map.put(info1, "test1");
map.put(info2, "test2");
2 つの異なるエントリがあります。
さて、それは望ましい動作かもしれません。たとえば、EventInfo
異なるイベントを収集している場合、同じデータを持つ 2 つの異なるイベントを 2 つの異なるエントリにすることが望ましい場合があります。
equals
とhashCode
コントラクトは にも適用できますSet
。
たとえば、イベント情報にマウス クリックが含まれている場合、最終的に次のようになることが望ましい場合があります。
Set<EventInfo> collectedEvents = new HashSet<EventInfo>();
collectedEvents.add(info1);
collectedEvents.add(info2);
収集されたイベントは 1 つではなく 2 つ...
私がここで意味を成していることを願っています...
編集:
ただし、上記のセットとマップに 1 つのエントリのみを含める必要がある場合は、Apache Commons EqualsBuilderとHashCodeBuilderequals
を使用して、との実装を簡素化できhashCode
ます。
@Override
public boolean equals(Object obj) {
if (obj instanceof EventInfo) {
EventInfo other = (EventInfo) obj;
EqualsBuilder builder = new EqualsBuilder();
builder.append(name, other.name);
builder.append(info, other.info);
return builder.isEquals();
}
return false;
}
@Override
public int hashCode() {
HashCodeBuilder builder = new HashCodeBuilder();
builder.append(name);
builder.append(info);
return builder.toHashCode();
}
EDIT2:
EventInfo
2 つのインスタンスが同じと見なされる場合、たとえば、が一意の識別子である場合など、同じ名前を持っている場合も適切ですname
(特定のオブジェクトとは少しかけ離れていることはわかっていますが、ここで一般化しています... )