java - 通过依赖注入(inject)设置 Java Enums 值

标签 java enums

我创建了一个带有公共(public)嵌套枚举类和一些 setter 的类。嵌套枚举类使用的变量具有通过依赖注入(inject)到外部类设置的属性文件中的值。我希望使用外部类的组件不知道枚举的值并单独循环遍历每个值。枚举总是在外部类之后实例化,因此不必担心变量中的空值。有人告诉我这不是枚举应该如何使用的。建议是编写一个模仿枚举类的类,而不是仅仅使用枚举。这看起来非常教条,我很好奇人们的想法是什么以及可能的替代方案。我写过这样的东西:

public class myOuterClass {
    private static string1;
    private static string2;
    private static string3;

    public enum NestedEnum {
        MY_ENUM1("enum1: "+string1),
        MY_ENUM2("enum2: "+string2),
        MY_ENUM3("enum3: "+string3);

        private String enumValue = "";

        NestedEnum(String enumValue) {
            this.enumValue = enumValue;
        }

        public String getEnumValue() { return enumValue; }
    }


    public String printEnum(NestedEnum enum) {
        System.out.println(enum.getEnumValue());
        return enum.getEnumValue();
    }


    public void setString1(String string1) {
        this.string1 = string1;
    }
    public void setString2(String string2) {
        this.string2 = string2;
    }
    public void setString3(String string3) {
        this.string3 = string3;
    }
}

最佳答案

您的方法的问题在于您的枚举实际上并不是依赖注入(inject)的;相反,它们拥有自己的实例化逻辑(就像枚举总是那样),并且它们只是以一种脆弱且不可执行的方式依赖于在类加载器加载枚举类之前完成的依赖项注入(inject)。 (请注意,由于枚举是公共(public)​​的,因此您无法真正控制何时发生这种情况;您的 DI 框架也无法控制。)

解决此问题的一种方法是将枚举的构造函数调用到 DI 框架中。 (例如,如果您使用 Guice 并拥有 Injector 的单例实例,则枚举的构造函数可以向其请求适当的实例,从而保证顺序。)这并不理想 - 它引用您的 DI 设置会污染您的类代码 - 但它比您拥有的要好。

当然,另一种方法是不使用enum:让您的 DI 框架完成其工作并为您管理实例。但听起来你已经拒绝了这种方法;我该跟谁争论呢?


编辑添加:您的方法的另一个潜在问题是“重置”枚举的唯一方法是停止并重新启动 JVM。如果您的属性文件有多个版本(例如,不同的语言版本),那么您的测试框架可能无法测试它们是否都能正常工作。 (我上面的第一个建议没有解决这个问题。)

关于java - 通过依赖注入(inject)设置 Java Enums 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28220477/

相关文章:

mysql - 如何从索引中获取枚举元素

typescript - 迭代 Typescript 中的枚举项

java - 当传递枚举的字符串值时,如何在运行时访问任何已知枚举的值?

我可以将 C11 `_Atomic` 关键字应用于枚举类型吗?

java - 从文件执行 Hive 时查询编码不正确

java - Java中是否有可以容纳4个或更多值的数据结构

Java servlet 和数据库连接池

java - 为什么 WindowConstants.EXIT_ON_CLOSE 真的是一个 int ?它不应该是一个枚举吗?

java - 通过网络写入 4 个字节的无符号整数

Java String input = ""是什么意思?做?