java - 如何解决以下设计问题?

标签 java oop enums

我有课

public class MyCompleteObject {

   private MyEnumA enumA;

   private MyObjectB objectB; 

}

编辑(使其更清楚):enumA 和 objectB 是相互依赖的。 MyObjectB 有 3 个子类。并且 MyEnumA 的每个值只与 MyObjectB 的一个子类的对象相关

由于 MyObjectB 有 3 个子类,所以 objectB 可以有 3 种类型。 MyEnumA 有很多值(~30,因为我只需要它们的文本值,除了枚举想不出任何其他选项,如果枚举不应该有这么多值,请纠正我)。

因此,MyEnumA 和 MyObjectB 可以有 30x3 = 90 种组合,但并非所有这 90 种组合都是有效的。那就是我被困的地方。

解决这个问题的最佳方法是什么?我能想到的几个选项是:

1) 每当创建 MyCompleteObject 的实例时,我应该检查 enumA 和 objectB 是否相互一致,如果它们不一致则抛出异常(对这种方法感觉不太舒服)。

2) 使用enumA 和objectB 的不同组合创建很多子类。同样,这似乎不是一个有前途的解决方案,因为将根据不同的 enumA 和 objectB 组合创建许多子类。

更新 1)

在阅读了各种答案后,我想到的第三种方法是:

3) 首先按照@scottb 的回答说明制作可扩展的 rick 枚举类型。然后我想我可以在 MyCompleteObject 类中创建 3 个不同的构造函数: EnumA、EnumB 和 EnumC 是我的枚举,根据它们的有效性分类为 MyObjectB 的 3 个子类(@scottb 的回答)。 MyObjectBFirst、MyObjectBSecond 和 MyObjectBThird 是 MyObjectB 的三个子类。

public MyCompleteObject(EnumA enumA, MyObjectBFirst objectB){//}

public MyCompleteObject(EnumB enumB, MyObjectBSecond objectB){//}

public MyCompleteObject(EnumC enumC, MyObjectBThird objectB){//}

这样可以保证编译时检查。但是,那里有 3 个不同的构造函数。我也研究了构建器模式,但这里放不下。它旨在添加可选参数,但这里我有条件参数,所有参数都是必需的。

谢谢!

最佳答案

对于可扩展丰富的枚举类型来说,这听起来像是一个很好的用例:

public enum EnumA implements MyEnumType {
    COMMON_TO_A_1,
    :
    :
    COMMON_TO_A_N;

    @Override public void commonMethod1() { ... }
    :
}

public enum EnumB implements MyEnumType {
    COMMON_TO_B_1,
    :
    :
    COMMON_TO_B_N;

    @Override public void commonMethod1() { ... }
    :
}

public interface MyEnumType {
    void commonMethod1();
    :
    :
    int commonMethodN(String myParam);
}

通过使用 MyEnumType 作为类型名称,您将能够传入任何枚举组并对它们执行常见的类型安全操作。 Java 中的枚举工具是健壮的和类型安全的,并且通常优于滚动你自己的枚举类。我建议尽可能使用枚举工具。

缺点是这不是继承模式,没有普通枚举的超集。有时,这可以根据您的需要在代码中模拟而不会太麻烦。例如,您可以定义另一个枚举,它提供“基本枚举”的类文字,以便您始终可以在您执行的所有操作中引用这些常量,以及您使用接口(interface)类型传递的任何枚举组。

另一个缺点是,当您通过接口(interface)类型传递枚举常量时,它会失去其作为 Java 枚举工具成员的身份。我的意思是您将无法将 EnumMap 和 EnumSet 之类的东西与您的接口(interface)类型常量一起使用。有针对此限制的变通方法,但它们可能并不总是易于实现。

关于java - 如何解决以下设计问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31251897/

相关文章:

java - 添加样式后如何重置回默认 css?

java - 如何根据json中的特定键将一个数据流中的接收器添加到不同的路径?

javascript - 初学者 Angular 4 组件故障排除

oop - 多少对象太多了?

c++ - 如何在 C++ 中将 int 转换为枚举?

java - JPA 枚举比较不等于失败

eclipse - Java构建路径问题

java - 用java构建wsdl的框架或工具

javascript - 在 Javascript 中使用 includes() 匹配对象二维数组

java - 经典操作枚举示例中的 Lambda