如何通过其他变量从java类访问常量?

Mad*_*dan 2 java field

我有java类,其中包含以下所有常量:

public final class CategoryIDs {

  public static final String Extraction_of_natural_gas = "1111";
  public static final String Mining_of_hard_coal = "2222";
  public static final String Mining_of_iron_ores = "3333";
  public static final String Mining_of_lignite = "4444";

}
Run Code Online (Sandbox Code Playgroud)

现在我想通过一个包含变量名称的变量来访问其他类中的这些常量.

例如:

String temp = "Extraction_of_natural_gas";
Run Code Online (Sandbox Code Playgroud)

使用这个临时变量我想从上面的类访问常量.但我不能做 CategoryIDs.temp,因为它是不允许的.那么实现这一目标的最佳方法是什么?

Mur*_*nik 7

您可以使用反射来提取它:

String value = (String) CategoryIDs.class.getField(temp).get(null);
Run Code Online (Sandbox Code Playgroud)

null传递的参数get表示这是一个静态字段,并且不需要任何实例来获取其值.

请注意,此技术非常容易出错.上面的代码不包含任何错误检查或异常处理,以便更容易阅读,但真正的应用程序应该包含它们.


Jon*_*eet 7

如果您确实需要使用当前结构执行此操作,则可以使用反射.

但是,您可能会发现枚举更适合.就像是:

public enum CategoryID {

    EXTRACTION_OF_NATURAL_GAS("Extraction_of_natural_gas", 1111),
    MINING_OF_HARD_COAL("Mining_of_hard_coal", 2222),
    MINING_OF_IRON_ORES("Mining_of_iron_ores", 3333),
    MINING_OF_LIGNITE("Mining_of_lignite", 4444);

    private static final Map<String, CategoryID> keyMap;

    static {
        keyMap = new HashMap<>();
        for (CategoryID category : CategoryID.values()) {
            keyMap.put(category.getKey(), category);
        }
    }

    private final String key;
    private final int value;

    public int getValue() {
        return value;
    }

    public String getKey() {
        return key;
    }

    private CategoryID(String key, int value) {
        this.key = key;
        this.value = value;
    }

    public static CategoryID fromKey(String key) {
        return keyMap.get(key);
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的好处:

  • 您将代码中的名称(现在更常用于Java)与您在数据中提供的密钥分开.这意味着您可以在数据中使用您想要的任何键,包括具有空格等的键.它们不再需要是有效的标识符.
  • 当您从代码中引用枚举值时,仍然可以获得编译时的安全性.
  • 您将获得更好的安全性,因为您永远不会意外地使用字符串而不是类别ID,您可以使用常量轻松完成.