我创建了一个带有公共(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/