1

我正在考虑Set在 Java 中使用 BusinessObjects。我的意图是,在每个集合中,每个业务对象应该只有一个实例,但一个业务对象可以在多个集合之间共享。所以,举个例子:

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;
    }
}

你认为这是个好主意吗?

4

4 回答 4

4

为什么不简单地使用枚举?您可以使用Enum业务对象和EnumSet业务对象。

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY;
    static final EnumSet<Day> weekend = EnumSet.of(SATURDAY,SUNDAY);
}

教程在这里

现在,如果您的业务对象不是为上述目的而设计的,那么只需以正常方式实现 equals 和 hashcode。HashSet add 方法无论如何都会忽略重复项。

这个链接讨论了equals和hashcode合约。

对于业务对象,一般规则是相等的,并且需要使用您的业务对象 PK 来实现哈希码。

Like For Employee 对象,员工编号可以被视为业务密钥,而 pk 可以不同,因此 equals 和 hashcode 应该基于员工编号。

于 2012-09-26T18:22:37.323 回答
3

不,这是个坏主意。这实际上并不能阻止代码的不同部分执行

BusinessObject bo1 = new BusinessObject();
bo1.setId(1);
bo1.setName("foo");

BusinessObject bo1copy = new BusinessObject();
bo1copy.setId(1);
bo1copy.setName("bar");

因此具有具有不同字段值的相同“业务对象”的两个副本。

您的 equals() 实现还将所有实例BusinessObject视为具有相同的值(bo1.equals(bo1copy) == true在上面的代码中),这将在任何类型的集合中使用它。

如果您需要控制在程序中实例化的某种类型的实例数量,那么只需实例化对象的一个​​实例即可。

于 2012-09-26T18:24:11.440 回答
2

将所有业务对象放入一个 HashSet。HashSet 中不能有重复项(通过 equals 方法),因此如果将 B1、B11 和 B2 放入 HashSet,它将包含 B1 和 B2。

您应该覆盖 BusinessObject 中的 equals 和 hashCode 方法,以使用那些使 BusinessObject 唯一的属性。

于 2012-09-26T18:26:00.270 回答
0

如果由于某种原因您不能遵循 AmitD 的建议并使用 Enums,那么您可以使用在标记界面上键入的 Maps 而不是 Sets。

我不知道这会解决什么问题,但是...

  1. 创建一个新的 Marker 界面
  2. 让您的每个业务对象类实现它
  3. 在您想要收集如您所描述的每个地方,使用

    Map<Class<? extends Marker>, Marker> soloBOMap = // whatever concrete map;
    soloBOMap.put(bo.getClass(), bo);
    

有点奇怪; 我敢肯定。

于 2012-09-26T18:40:27.143 回答