取决于你想要发生什么。如果两个不同EventInfo
的实例具有相同的name
andinfo
应该导致两个不同的键,那么你不需要实现equals
and hashCode
。
所以
EventInfo info1 = new EventInfo();
info1.setName("myname");
info1.setInfo(null);
EventInfo info2 = new EventInfo();
info2.setName("myname");
info2.setInfo(null);
info1.equals(info2)
将返回 falseinfo1.hashCode()
并将返回不同的值info2.hashCode()
。
因此,当您将它们添加到地图时:
map.put(info1, "test1");
map.put(info2, "test2");
你会有两个不同的条目。
现在,这可能是理想的行为。例如,如果您EventInfo
正在收集不同的事件,则可能希望两个具有相同数据的不同事件成为两个不同的条目。
equals
andhashCode
合同也适用于Set
a 。
因此,例如,如果您的事件信息包含鼠标点击,那么您可能希望最终得到:
Set<EventInfo> collectedEvents = new HashSet<EventInfo>();
collectedEvents.add(info1);
collectedEvents.add(info2);
2 个收集的事件,而不仅仅是 1 个......
希望我在这里有意义...
编辑:
但是,如果上面的 set 和 map 应该只包含一个条目,那么您可以使用 apache commons EqualsBuilder和HashCodeBuilder来简化equals
and的实现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();
}
编辑2:
如果两个EventInfo
实例被认为是相同的,如果它们具有相同的名称,例如如果name
是一些唯一标识符(我知道它与您的特定对象有点牵强,但我在这里概括... )