从枚举值实例化类的好习惯

时间:2013-02-12 13:53:48

标签: java enums instantiation

我一直在寻找很多地方,但我没有找到解决问题的好方法:

我有一个枚举,例如:

public enum Window { CLASSIC, MODERN }

我需要根据枚举值分离我的应用程序的行为,如:

switch (myWindow.getType()) {
  case CLASSIC: new ClassicWindow(...);
  case MODERN: new ModernWindow(...);
}

我知道你的想法:简单地把它放在enum和basta中,但是这不是唯一取决于我的枚举的类!而且我无法编写与对象一样多的对象创建方法!

简单地说,在这种情况下我该怎么办?我的一个朋友告诉我要删除枚举并每次都使用派生类,但最后我必须创建尽可能多的实例作为我所有测试的子类!

简而言之,我被困住了。

你知道最佳做法吗?感谢

3 个答案:

答案 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();