0

现在,我们都知道枚举是处理多实例的好方法(即,具有固定数量实例的类,在编译时已知),因为每个常量几乎都是您自己的枚举类的单例子类。但是,我遇到了如何进行枚举常量特定初始化的问题。

假设我们有以下枚举:

public enum InputMethod {
    FOO {
        private final FooFactory factory;

        public Document createDocument(String inputString) {
            return factory.createFooParser().parse(inputString);
        }
    },
    BAR {
        public Document createDocument(String inputString) {
            BarBuilder builder = new BarBuilder();
            builder.setInput(inputString);
            return input.build();
        }
    };

    public abstract Document createDocument(String inputString);
}

我想要做的是FooFactoryInputMethod.FOO. 为了做到这一点,我必须打电话给,说,FooFactory.newInstance()。但是,这可能会抛出异常,所以我不能简单地factory = FooFactory.newInstance()直接说。我不能把它放在枚举类型的构造函数中,因为InputMethod.BAR它没有以任何方式使用 FooFactory。由于静态初始化相对于枚举常量本身的初始化的顺序,使用静态初始化似乎不起作用。最后,我不能显式声明一个构造函数,因为它的子类InputMethodFOO一个恰好是匿名的实例。

那么,除了让自己接受惰性初始化之外,我将如何正确初始化FooFactory实例InputMethod.FOO

4

1 回答 1

2
public enum InputMethod {
    FOO {
        private final FooFactory factory;
        {
            try {
                factory = Factory.newInstance();
            } catch (...) {
                ...
            }
        }
        public Document createDocument(String inputString) {
            return factory.createFooParser().parse(inputString);
        }
    },
    BAR { ... };
    public abstract Document createDocument(String inputString);
}
于 2012-10-06T07:23:51.850 回答