现在,我们都知道枚举是一种很好的多方式方法(即一个具有固定数量的实例的类,在编译时已知),因为每个常量几乎都是你自己的单例子类枚举类。但是,我遇到了如何使枚举常量特定初始化的问题。
假设我们有以下枚举:
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
实例?
答案 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);
}