我正在考虑在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可以不同,因此等于和哈希码应基于员工编号。

08-03 12:25