我有一堂课
public class MyCompleteObject {
private MyEnumA enumA;
private MyObjectB objectB;
}
编辑(更清楚地说):enumA和objectB是相互依赖的。 MyObjectB具有3个子类。并且MyEnumA的每个值仅与MyObjectB子类之一的对象一起使用
由于MyObjectB具有3个子类,因此objectB可以是3种类型。 MyEnumA有很多值(〜30,因为我只需要它们的文本值,除了enum之外没有其他选择,如果enum不应该有那么多值,请更正我)。
因此,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中的枚举功能强大且类型安全,通常优于自己的枚举类。我建议尽可能使用枚举功能。
缺点是这不是继承模式,并且没有通用枚举的超集。有时,可以在代码中对其进行仿真,而无需过多麻烦,具体取决于您的需求。例如,您可以定义另一个枚举,该枚举提供“基本枚举”的类文字,以便您可以始终在执行的所有操作以及使用接口类型传递的任何枚举组中引用这些常量。
另一个缺点是,当您通过接口类型传递枚举常量时,它将失去其作为Java枚举功能的成员的身份。我的意思是,您将无法通过接口类型的常量使用EnumMap和EnumSet之类的东西。有一些解决方法可以解决此限制,但实施起来可能并不总是很干净。