我一直在寻找很多地方,但我没有找到解决问题的好方法:
我有一个枚举,例如:
public enum Window { CLASSIC, MODERN }
我需要根据枚举值分离我的应用程序的行为,如:
switch (myWindow.getType()) {
case CLASSIC: new ClassicWindow(...);
case MODERN: new ModernWindow(...);
}
我知道你的想法:简单地把它放在enum和basta中,但是这不是唯一取决于我的枚举的类!而且我无法编写与对象一样多的对象创建方法!
简单地说,在这种情况下我该怎么办?我的一个朋友告诉我要删除枚举并每次都使用派生类,但最后我必须创建尽可能多的实例作为我所有测试的子类!
简而言之,我被困住了。
你知道最佳做法吗?感谢
答案 0 :(得分:0)
您似乎在寻找design pattern,而不是使用枚举的良好做法。您打算编写的代码将包含switch语句,每个可能的枚举值都有一个条件 - 从长远来看,很难维护和扩展。更好的想法是在一个单独的类中重构每个可能的案例行为,可能使用Abstract Factory模式。
答案 1 :(得分:0)
这是工厂模式。 This example实际上显示了您正在做的事情。
答案 2 :(得分:0)
您可以在枚举中实现一个接口,让它们充当工厂:
interface WindowBuilder {
Window makeWindow();
}
enum WindowType implements WindowBuilder {
SIMPLE {
public Window makeWindow() { return new SimpleWindow() }
},
[... other enums]
}
或者您可以使用反射并将类绑定到枚举类型,以使它们(再次)作为工厂工作:
enum WindowType {
SIMPLE(SimpleWindow.class),
[... other enums]
private final Class<? extends Window> wndType;
private WindowType(Class<? extends Window> wndType) {
this.wndType = wndType;
}
public Window makeWindow() {
// in fact you will need to either catch the exceptions newInstance can throw, or declare the method can throw them
return this.wndType.newInstance();
}
}
无论哪种方式,你都可以随后打电话给他们:
Window window = myWindow.getType().makeWindow();