这里的问题是我们使用的属性文件具有非常大的名称作为密钥,我们大多数人遇到错误的密钥命名问题。所以它让我思考是否有基于属性文件生成以下接口的方法。我们对属性文件所做的每个更改都将自动调整Properties接口。还是有其他解决方案吗?
属性文件
A=Apple
B=Bannana
C=Cherry
应该生成以下接口
interface Properties{
public static final String A = "A" // keys
public static final String B = "B";
public static final String C = "C";
}
所以在我的应用程序代码中
String a_value = PROP.getString(Properties.A);
答案 0 :(得分:1)
有一个关于编程的旧规则,不仅仅是关于它,如果某些东西看起来很漂亮,那么很可能它是正确的方法。
从我的观点来看,这种方法看起来不太好。
第一件事:
不要在接口中声明常量。它违反了封装方法。请查看此文章:http://en.wikipedia.org/wiki/Constant_interface
第二件事:
为属性的名称部分使用前缀 special ,例如:key_
当您加载属性文件时,迭代键并提取名称以key_
开头的键,并使用这些键的值,因为您计划在问题中使用这些常量。
<强>更新强>
假设我们在编译过程中使用Apache Ant脚本生成一个巨大的属性文件。
例如,让我们的属性文件(myapp.properties
)看起来像这样:
key_A = Apple
key_B = Banana
key_C = Cherry
anotherPropertyKey1 = blablabla1
anotherPropertyKey2 = blablabla2
我们要处理的特殊属性的关键名称以key_
前缀开头。
所以,我们编写以下代码(请注意,它没有经过优化,只是概念证明):
package propertiestest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
public class PropertiesTest {
public static void main(String[] args) throws IOException {
final String PROPERTIES_FILENAME = "myapp.properties";
SpecialPropertyKeysStore spkStore =
new SpecialPropertyKeysStore(PROPERTIES_FILENAME);
System.out.println(Arrays.toString(spkStore.getKeysArray()));
}
}
class SpecialPropertyKeysStore {
private final Set<String> keys;
public SpecialPropertyKeysStore(String propertiesFileName)
throws FileNotFoundException, IOException {
// prefix of name of a special property key
final String KEY_PREFIX = "key_";
Properties propertiesHandler = new Properties();
keys = new HashSet<>();
try (InputStream input = new FileInputStream(propertiesFileName)) {
propertiesHandler.load(input);
Enumeration<?> enumeration = propertiesHandler.propertyNames();
while (enumeration.hasMoreElements()) {
String key = (String) enumeration.nextElement();
if (key.startsWith(KEY_PREFIX)) {
keys.add(key);
}
}
}
}
public boolean isKeyPresent(String keyName) {
return keys.contains(keyName);
}
public String[] getKeysArray() {
String[] strTypeParam = new String[0];
return keys.toArray(strTypeParam);
}
}
类SpecialPropertyKeysStore
过滤并将所有特殊键收集到其实例中。
你可以获得这些键的数组,或检查键是否存在。
如果您运行此代码,您将获得:
[key_C, key_B, key_A]
它是带有特殊键名的返回数组的字符串表示。
根据您的要求更改此代码。
答案 1 :(得分:1)
我不会从属性生成类或接口,因为您将失去以下功能:
您还可以使用枚举,或创建一些特殊的Property
类,其名称为only和final字段。然后,您只需要get
方法,即Properties
,Map
或其他任何方法。
对于您的请求,您可以使用maven-exec-plugin执行代码。
您应该只创建一个可以读取属性文件的主文件,以及每个密钥:
_
)因为它是构建的一部分,比如说在构建依赖于这些常量的其他类之前,我建议你创建一个特定的maven项目来隔离这些构建。
尽管如此,我真的不会这样做并使用加载了任何需要的POJO(CDI,Spring,静态初始化等)。