枚举常量特定初始化

时间:2012-10-06 07:14:50

标签: java constructor enums initialization multiton

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

假设我们有以下枚举:

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);
}

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

那么,除了让自己退出延迟初始化之外,我如何正确初始化FooFactory中的InputMethod.FOO实例?

1 个答案:

答案 0 :(得分: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);
}