从Constant.java文件中获取所有字符串值对

时间:2014-07-08 11:44:21

标签: java string if-statement constants

我有一个现有的Constant.java使用,我必须编写一个逻辑,这样如果输入字符串包含任何常量字符串,那么做一些事情。

 public class Constants {

    public static final String CONSTANT_ONE = "VALUE_CONSTANT_ONE";
    public static final String CONSTANT_TWO = "VALUE_CONSTANT_TWO";
    //and so on..
}

Validate.checkPhrase()是一个布尔方法,它接受输入字符串和常量字符串作为参数,将它们转换为小写并将输出传递给java.lang.String.contains()方法进行验证。

在我的主要逻辑中,如果有多个条件,我正在使用

if (Validate.checkPhrase(str,CONSTANT_ONE) 
|| Validate.checkPhrase(str,CONSTANT_TWO)|| /* multiple checks */ ){
//do something
}

每次添加新常量时,我​​都必须手动将其添加到if condition。 有没有办法可以从Constant.java获取所有字符串,值对,并在我的逻辑中使用它。

4 个答案:

答案 0 :(得分:4)

要获取所有常量,您可以使用以下代码 -

    HashMap<String,String> pairs= new HashMap<String,String>();
    Constants constants= new Constants();
    Field[] f = constants.getClass().getFields();
    for (int i = 0; i < f.length; i++) {
        pairs.put(f[i].getName().toLowerCase(),f[i].get(constants).toString());
    }
    System.out.println(pairs);

更新 -

同样,由于所有字段都是静态的,我们可以使用类名 -

访问它
    HashMap<String,String> pairs= new HashMap<String,String>();
    for(Field field :Constants.class.getFields())
    { 
        pairs.put(field.getName().toLowerCase(),field.get(null).toString());
    }
    System.out.println(pairs);

输出地图 -

{constant_two=VALUE_CONSTANT_TWO, constant_one=VALUE_CONSTANT_ONE}

答案 1 :(得分:2)

正如你所知道的那样,否则通常应该避免使用块,因为它们会导致难以阅读的代码并增加不必要的依赖性。

在这种情况下,为什么不将所有常量放在列表或其他类型的容器中?然后你可以使用

循环列表

Validate.CheckPhrase(str, list[index])

答案 2 :(得分:1)

您可以尝试类似下面的内容:

enum CONSTANTS {
    VALUE_CONSTANT_ONE, VALUE_CONSTANT_TWO
}

然后使用它:

        boolean result = false;
       //simulates your if ( checkPhrase ||checkPhrase)
        for (CONSTANTS c : CONSTANTS.values()) {
            result = Validate.checkPhrase(str,c.toString());
            if (result) {
                break;
            }
        }
        if (result) {
            System.out.println("do your stuff");
        }

这样,如果添加新的枚举,检查仍然不受影响。

如果您不想再次编译,请使用属性文件,例如constants.properties

CONSTANT_ONE=VALUE_CONSTANT_ONE
CONSTANT_TWO=VALUE_CONSTANT_TWO

可以像下面一样使用它:

    Properties constants = new Properties();
    try (FileInputStream fin = new FileInputStream(
            "D:\\constants.properties");) {
        constants.load(fin);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // to check whats loaded
    System.out.println(constants);
    String str = "Your String";
    boolean result = false;
    for (String key : constants.stringPropertyNames()) {
        result = Validate.checkPhrase(str, constants.getProperty(key));
        if (result) {
            break;
        }
    }
    if (result) {
        System.out.println("do your stuff");
    }

答案 3 :(得分:0)

我认为没有更好的方法可以做到这一点。

我建议您开始寻找Constants课程的替代方案。

最明显的一种方法是用enum类型替换类。这将允许你做以下事情:

  • 迭代枚举的所有值,

  • switch - 枚举值,或

  • 定义谓词以对枚举值进行子分类。

另一种方法是将所有常量字符串放入数组中......或者设置为某种类型的Set ...并且迭代数组或在集合上使用contains。 (注意,迭代大量的字符串效率不高......)

如果你需要一组常量字符串是动态的,那么你可以摆脱命名的常量和静态初始化的数组/集合。用Map<String, Int>替换它们,并从配置文件或数据库或类似的东西填充它。 (这不允许您使用Java标识符来引用源代码中的常量...)


请注意,Java已支持enum类型多年。我原以为你的Constants应该很久以前就已被替换了......