如何通过提供字符串来检索常量值?

时间:2018-02-01 02:06:55

标签: java

考虑这个课程

package com.bluegrass.core;

public class Constants {
    public static final String AUTHOR="bossman";
    public static final String COMPANY="Bluegrass";
    //and many more constants below
}

我想创建一个如下所示的函数:

getConstantValue("AUTHOR") //this would return "bossman"

任何想法如何做到这一点?

3 个答案:

答案 0 :(得分:1)

如果您能够将public static final字段更改为枚举,那么最简单的解决方案(也可以使用枚举而不是字符串是类型安全的)可以使用枚举。

public enum Constants {
    AUTHOR("bossman"),
    COMPANY("Bluegrass");

    private final String content;

    Constants (String content) {
        this.content= content;
    }

    public String getContent() {
        return content;
    }

    public static Constants getConstant(String content) {
        for (Constants constant : Constants.values()) {
            if (constant.getContent().equals(content)) {
                return constant;
            }
        }
        return null; //default value
    }
}

用法:

Constants.valueOf("AUTHOR") == Constants.AUTHOR
Constants.getConstant("bossman") == Constants.AUTHOR
Constants.AUTHOR.getContent() == "bossman"

因此,不是OP的getConstantValue("AUTHOR"),而是Constants.valueOf("AUTHOR").getContent()

答案 1 :(得分:0)

有很多方法可以解决这个问题。

一种方法是使用开关。

示例:

public String foo(String key) throws AnException {
  switch (key) {
    case case1:
      return constString1;
    case case2:
      return constString2;
    case case3:
      return constString3;
      ...
     default:
      throws NotValidKeyException; //or something along these lines
    }
}

另一种方法是创建一个map<string,string>并用所需的密钥填充它。

答案 2 :(得分:0)

您可以使用反射:

public static String getConstantValue(String name) {
    try {
        return (String) Constants.class.getDeclaredField(name).get(null);
    } catch (Exception e) {
        throw new IllegalArgumentException("Constant value not found: " + name, e);
    }
}

更新:枚举解决方案。

如果您可以将Constants课程更改为enum,则会改为:

private static String getConstantValue(String name) {
    return Constants.valueOf(name).getText();
}

Constants

需要这样的内容
public enum Constants {
    AUTHOR("bossman"),
    COMPANY("Bluegrass");

    private final String text;

    private Constants(String text) {
        this.text = text;
    }
    public String getText() {
        return this.text;
    }
}