我有一些代码使用了一个包含大量硬编码常量的类.这就是它的样子:
class Constants{
public static final String name1 = "value1";
public static final String name2 = "value2";
public static final Integer value3 = 3;
... and so on
}
Run Code Online (Sandbox Code Playgroud)
这些常量在代码中的任何地方都可以使用Constants.name1.
我现在需要做的是可以在配置文件中指定这些常量的值,可能是*.properties文件.
我的问题是:最好的方法是什么,必须尽可能少地重写代码?
我想用一个单一的配置类实例化时,从文件中读取性能,但后来我不得不值的所有静态调用替换到调用这个类的一个实例,我将不得不改变现有的方法来传递这个将实例配置到它们中.有没有更好的办法?
这是我过去使用过的一段代码 - 可以适应您的示例:
public enum Configuration {
PROPERTY1("property1.name", "default_value_1"),
PROPERTY2("property2.name", "default_value_2");
private final String key;
private String defaultValue;
Configuration(String key) {
this(key, NA);
}
Configuration(String key, String defaultValue) {
this.key = key;
this.defaultValue = defaultValue;
}
private final static Logger logger = LoggerFactory.getLogger(Configuration.class);
private final static String NA = "n.a.";
private final static String CONFIG_FILE = "properties/config.properties";
private final static String NOT_A_VALID_KEY = "Not a valid property key";
private final static Map<Configuration, String> configuration = new EnumMap<>(Configuration.class);
static {
readConfigurationFrom(CONFIG_FILE);
}
private static void readConfigurationFrom(String fileName) {
logger.info("Reading resource: {}", fileName);
try (InputStream resource = Configuration.class.getClassLoader().getResourceAsStream(fileName);) {
Properties properties = new Properties();
properties.load(resource); //throws a NPE if resource not founds
for (String key : properties.stringPropertyNames()) {
configuration.put(getConfigurationKey(key), properties.getProperty(key));
}
} catch (IllegalArgumentException | IOException | NullPointerException e) {
logger.error("Error while reading the properties file {}", fileName, e);
populateDefaultValues();
}
}
private static Configuration getConfigurationKey(String key) {
for (Configuration c : values()) {
if (c.key.equals(key)) {
return c;
}
}
throw new IllegalArgumentException(NOT_A_VALID_KEY + ": " + key);
}
private static void populateDefaultValues() {
for (Configuration c : values()) {
configuration.put(c, c.defaultValue);
}
}
/**
* @return the property corresponding to the key or null if not found
*/
public String get() {
return configuration.get(this);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3108 次 |
| 最近记录: |