我有课
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/