Java 枚举常量特定初始化

Java 枚举常量特定初始化,java,constructor,enums,initialization,multiton,Java,Constructor,Enums,Initialization,Multiton,现在,我们都知道enum是一种很好的多实例方法(例如,一个在编译时拥有固定数量实例的类),因为每个常量几乎都是自己enum类的一个子类。但是,我遇到了一个问题,即如何使枚举常量特定于初始化 假设我们有以下枚举: public enum InputMethod { FOO { private final FooFactory factory; public Document createDocument(String inputString) {

现在,我们都知道enum是一种很好的多实例方法(例如,一个在编译时拥有固定数量实例的类),因为每个常量几乎都是自己enum类的一个子类。但是,我遇到了一个问题,即如何使枚举常量特定于初始化

假设我们有以下枚举:

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);
}
我要做的是初始化
InputMethod.FOO
中的
FooFactory
实例。为了做到这一点,我必须调用,比如,
FooFactory.newInstance()
。但是,这可能会引发异常,因此我不能直接说
factory=FooFactory.newInstance()
。我无法将其放入枚举类型的构造函数中,因为
InputMethod.BAR
没有以任何方式使用FooFactory。由于静态初始化相对于枚举常量本身的初始化的顺序,使用静态初始化似乎不起作用。最后,我不能显式声明构造函数,因为
InputMethod
的子类
FOO
是的一个实例,只是碰巧是匿名的

因此,除了让自己接受惰性初始化,我如何正确初始化
InputMethod.FOO
中的
FooFactory
实例?

“我不能将其放入枚举类型的构造函数中,因为InputMethod.BAR不使用FooFactory”=>您可以传递一个空工厂。但是,由enum负责创建工厂听起来并不正确。
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);
}