从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-确实如此。但他必须修改代码