java - 枚举常量特定初始化

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

我想要做的是初始化InputMethod.FOO中的FooFactory实例。为此,我必须调用 FooFactory.newInstance()。但是,这可能会引发异常,因此我不能直接直接说 factory = FooFactory.newInstance() 。我无法将其放入枚举类型的构造函数中,因为 InputMethod.BAR 不以任何方式使用 FooFactory。由于静态初始化相对于枚举常量本身的初始化的完成顺序,使用静态初始化似乎不起作用。最后,我无法显式声明构造函数,因为 FOO 的实例 InputMethod 的子类恰好是匿名的。

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

最佳答案

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

关于java - 枚举常量特定初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12757643/

相关文章:

java - 需要一个 ANT 任务在最终的 jar/lib 目录中包含一组 jar 文件

c++ - "No default constructor"为类类型

javascript - 在 CoffeeScript 构造函数中调用时,jQuery 无法将事件处理程序附加到对象

Java 基于Enum值的retainAll

java - 使用 crontab 中的 java 文件执行 bash 文件

java - Deflater.deflate 和小输出缓冲区

java - 使用 Jackson 在运行时将实体动态序列化为其 ID 或其完整表示

flutter - dart/flutter : Syntax error when using ui. Gradient.线性

c# - 使用 EF 模型从字符串字段中存储和检索枚举的无缝方式

visual-studio - 在 Visual Basic 6 上链接 ENUM