我有一个现有的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
获取所有字符串,值对,并在我的逻辑中使用它。
答案 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
班应该很久以前就已被替换了......