【问题标题】:How to get an enum of static class members in Java?如何在 Java 中获取静态类成员的枚举?
【发布时间】:2022-12-17 13:03:41
【问题描述】:

我有一个 Java 类(我不控制也不能修改),它有大量的静态 String 成员。我怎样才能将这些作为枚举(为了编码方便)?

例如。我有:

public class ClassWithStaticMembers {
  public static String ONE = "one";
  public static String TWO = "dos";
}

...我想从中得出以下结论:

public enum NUMBERS {
  ONE,
  TWO
}

这是可能的,有反思或其他方式吗?

(假设我不太了解 Java,并且我有 100 多个值,所以重复每个值是痛苦的,也是不可取的(以防以后添加更多值)。而且我不需要类中的实际值(“一个”和上面的“dos”))。

【问题讨论】:

  • 1. 没有意义。 2. Numbers.valueOf(ClassWithStaticMembers.ONE.toUpperCase());
  • 编码的便利性到底是什么?如果它是静态 final 或枚举常量,则仅使用常量名称几乎相同。问题是枚举是否还有您认为重要的其他属性。
  • 你说什么意思“将这些作为枚举”?如果您只是想将这些字符串解析为现有枚举的常量,则不需要使用反射。
  • 方便,可能与 Java 的无知和懒惰混合在一起,是我有一个使用枚举的上下文(像上面的那个,但有超过 100 个值),我找到了一个与静态成员具有相同值的类.我要么太懒,要么害怕,要么不允许更改任何一个上下文,所以我想要一个函数在它们之间进行映射(形式为 Class -> Enum 或其他)。我不想重复值(以便我从类的未来更新中受益,例如,在使用枚举的上下文中)。
  • “如果您只是想将这些字符串解析为现有枚举的常量,那么它不需要使用反射”:可能这就是我想要的:我该怎么做?

标签: java reflection enums


【解决方案1】:

为简单起见:枚举是静态描述的,因此不可能通过反射创建它。

您仍然可以创建一个枚举来包装您的常量,并且可以选择进行单元测试(使用反射)以确保您的枚举是完整的。

public enum NumbersEnumeration {
  ONE(ClassWithStaticMembers.ONE),
  TWO(ClassWithStaticMembers.TWO);
  private static final String name;
  public String getName();
  public NumbersEnumeration(String name){this.name=name;}
}


public class NumbersEnumerationTest{

  @Test
  public void checkEnumComplete() throws Exception{
    var fields = List.of(NumbersEnumeration.class.getDeclaredFields());
    for( var field:fields){
      Assertions.assertNotNull(NumbersEnumeration.valueof(field.getName());
    }
  }
}

(反射可能存在编译问题,但你明白了)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多