【问题标题】:How to access constants from a java class through other variable?java - 如何通过其他变量访问java类中的常量?
【发布时间】:2017-07-04 08:21:17
【问题描述】:

我有一个 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";

}

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

例如:

String temp = "Extraction_of_natural_gas";

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

【问题讨论】:

  • CategoryIDs.yourconstants
  • 我认为使用Map
  • CategoryIDs.Extraction_of_natural_gas.equals ("1111")
  • 但是正确的方法有什么问题:CategoryIDs.Extraction_of_natural_gas ....??

标签: java field


【解决方案1】:

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

String value = (String) CategoryIDs.class.getField(temp).get(null);

传递给getnull 参数表示这是一个静态字段,无需实例即可获取其值。

请注意,这种技术很容易出错。上面的代码不包含任何错误检查或异常处理以使其更易于阅读,但真正的应用程序可能应该包含它们。

【讨论】:

  • 嘿..感谢这个解决方案。这是我从未使用过的新东西。我试过这个,它提供了异常处理的选项。它对我有用:)
【解决方案2】:

如果您真的非常需要对当前结构执行此操作,则可以使用反射。

但是,您可能会发现枚举更合适。比如:

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

这种方法的好处:

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

【讨论】:

  • 嗨.. 感谢您的解决方案。我将检查我是否可以在我的代码中使用枚举。 :)
  • 实际上我有大量的条目要处理。我试图有一个属性文件。但是我将我的代码导出到一个 jar 文件中,并且它无法识别属性文件的路径。所以我不能走那条路。
  • @Madhusudan:恐怕我真的不明白你的评论。这些与 jar 文件和属性文件有什么关系?这就像你在回答一个完全独立的问题......
  • 好的..请忽略。试一试后我会开始一个新问题:)
【解决方案3】:

我认为您正在寻找内省。这是反射的“只读”部分,您可以在其中检索对象的值。

为了便于理解,代码如下:

    Object value = null;
    String constName = "Bar";
    Field constant = Foo.class.getField( constName );

    if ( constant != null ) {
        value = constant.get( null );
    }

    if ( value != null ) {
        System.out.println( value );
    } else {
        System.out.println( "Constant " + constName + " was not found." );
    }

有趣的是,您可以从调用 get()Field 对象中访问值,然后传递 null,因为该常量是静态的,因此您没有实例来提取价值来自。

你可以在这里找到完整的代码:http://ideone.com/v4fcvH

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多