Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Constant.java文件获取所有字符串-值对_Java_String_If Statement_Constants - Fatal编程技术网

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

从Constant.java文件获取所有字符串-值对,java,string,if-statement,constants,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.. }

我有一个现有的
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与多个条件一起使用

if (Validate.checkPhrase(str,CONSTANT_ONE) 
|| Validate.checkPhrase(str,CONSTANT_TWO)|| /* multiple checks */ ){
//do something
}
每次添加新常量时,我也必须手动将其添加到
if条件中。

是否有一种方法可以从
Constant.java
中提取所有字符串、值对,并将其用于我的逻辑中。

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

我建议您开始寻找
常量
类的替代方案

最明显的是用
enum
类型替换类。这将允许您执行以下操作:

  • 迭代枚举的所有值

  • 开关
    -ing打开枚举值,或

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

另一种方法是将所有常量字符串放入数组中。。。或者一套,如果某种。。。并在数组上迭代或在集合上使用
contains
。(请注意,对大量字符串进行迭代是没有效率的…)

如果需要常量字符串集是动态的,那么可以去掉命名常量和静态初始化的数组/集合。将它们替换为
映射
,并从配置文件或数据库或类似文件中填充它。(这不允许您使用Java标识符引用源代码中的常量…)



请注意,
enum
类型在Java中已支持多年。我原以为你的
常量
类早就应该被替换了…

我不认为有更好的方法来做到这一点

我建议您开始寻找
常量
类的替代方案

最明显的是用
enum
类型替换类。这将允许您执行以下操作:

  • 迭代枚举的所有值

  • 开关
    -ing打开枚举值,或

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

另一种方法是将所有常量字符串放入数组中。。。或者一套,如果某种。。。并在数组上迭代或在集合上使用
contains
。(请注意,对大量字符串进行迭代是没有效率的…)

如果需要常量字符串集是动态的,那么可以去掉命名常量和静态初始化的数组/集合。将它们替换为
映射
,并从配置文件或数据库或类似文件中填充它。(这不允许您使用Java标识符引用源代码中的常量…)



请注意,
enum
类型在Java中已支持多年。我原以为您的
常量
类早就应该被替换了…

正如您所认识到的那样,如果不是这样的话,通常应该避免使用块,因为它们会导致难以读取的代码并添加不需要的依赖项

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


Validate.CheckPhrase(str,list[index])
如您所知,通常应避免使用if-else-if块,因为它们会导致代码难以读取,并添加不需要的依赖项

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


Validate.CheckPhrase(str,list[index])
要获取所有常量,可以使用以下代码-

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

您可以尝试以下类似的方法:

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

您可以尝试以下类似的方法:

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

使用enum,使用循环并迭代其值,调用checkPhrase并在成功验证时返回true和break,否则继续验证。如果没有一次迭代验证成功,则返回false。如果您发现自己不断添加常量(明白吗?),您可能不希望将它们放在类中(这意味着重新编译、重新部署等),而是放在配置文件中。通过这种方式,您可以轻松修改常量列表,只需重新加载应用程序。此外,根据您的Java版本,您可以对字符串使用
switch
。使用enum,使用循环并迭代其值,调用checkPhrase并在成功验证时返回true和break,否则继续验证。如果没有一次迭代验证成功,则返回false。如果您发现自己不断添加常量(明白吗?),您可能不希望将它们放在类中(这意味着重新编译、重新部署等),而是放在配置文件中。通过这种方式,您可以轻松修改常量列表,只需重新加载应用程序即可。此外,根据您的Java版本,您可以在字符串上使用
switch
。在引入新的枚举值时,他必须添加新的开关大小写。@Shail016-确实如此。但他必须修改代码