我正在考虑在Java中使用BusinessObjects的Set
。我的意图是,每个集合中每个业务对象应该只有一个实例,但是一个业务对象可以在许多集合中共享。因此,例如:
BO1 - instance of BusinessObject1
BO11 - instance of BusinessObject1
BO2 - instance of BusinessObject2
这是对的
[BO1,BO2]或[BO1]
但这不是
[BO1,BO11]
由于我想确保这是强制性的,因此我在考虑指定这样的AbstractBusinessObject:
public abstract class AbstractBusinessObject {
@Override
public int hashCode() {
return this.getClass().getName().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj != null)
return this.getClass() == obj.getClass();
return false;
}
}
您认为这是个好主意吗?
最佳答案
为什么不简单地使用Enums?
您可以使用业务对象的Enum
和业务对象的EnumSet
。
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY;
static final EnumSet<Day> weekend = EnumSet.of(SATURDAY,SUNDAY);
}
教程here
现在,如果您的业务对象不是为上述目的而设计的,则只需以常规方式实现equals和hashcode。
HashSet的add方法将始终忽略重复项。
该link讨论了关于等号和哈希码协定。
对于业务对象,一般规则是相等的,并且需要使用您的业务对象PK来实现哈希码。
像For Employee对象一样,可以将员工编号视为业务密钥,而pk可以不同,因此等于和哈希码应基于员工编号。