4

我一直在寻找很多地方,但我没有为我的问题找到一个好的答案:

我有一个枚举,例如:

public enum Window { CLASSIC, MODERN }

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

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

我知道您的想法:只需将其放在枚举和 basta 中,但这并不是唯一取决于我的枚举的类!而且我写的对象创建方法不能和我有对象一样多!

简而言之,在这种情况下我该怎么办?我的一个朋友对我说要摆脱枚举并每次都使用派生类,但最后我必须为我的所有测试创建与子类一样多的实例!

简而言之,我被卡住了。

你知道一个最佳实践吗?谢谢

4

3 回答 3

2

您似乎正在寻找一种设计模式,而不是使用枚举的良好做法。您打算编写的代码将充满 switch 语句,每个可能的枚举值都有一个条件 - 从长远来看很难维护和扩展。一个更好的想法是在一个单独的类中重构每个可能的情况的行为,也许使用抽象工厂模式。

于 2013-02-12T13:57:16.683 回答
0

这是工厂模式。 这个例子实际上准确地显示了你在做什么。

于 2013-02-12T13:58:08.717 回答
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();
于 2013-02-12T14:03:16.433 回答