我目前正在一个服务器程序上工作,我想添加一个配置文件,以便用户可以更改某些项目,如端口,密码等。当文件第一次生成或我需要重新生成它时,我应该如何存储默认值,这让我很困惑。首先,我将它们存储在私有静态final变量中:
private static final int PORT = 12345;
然后改成Enum:
public Enum ConfigDefaults {
PORT("port", "12345");
private final String name;
private final string value;
public ConfigDefaults(String name, String value)
{
this.name = name;
this.value = value;
}
public String getName()
{
return name;
}
public String getValue()
{
return value;
}
}
我目前正在使用枚举,但它对我来说似乎不是最好的方法。您推荐用什么方法来存储文件的默认值?
如果你想静态地定义它们,就像你最初做的那样,你可以把它们放在ListResourceBundle中。
package codemasters;
import java.util.*;
public class Configuration extends ListResourceBundle {
protected Object[][] getContents() {
return new Object[][] {
{"port", 8080},
{"host", "codemasters.com"},
{"protocol", "http"}
};
}
}
然后你可以使用你的bundle:
public static void main(String[] args){
ResourceBundle resource = ResourceBundle.getBundle("codemasters.Configuration");
System.out.println(resource.getObject("port")); //8080
System.out.println(resource.getString("host")); //codemasters.com
}
你有两个问题需要解决。
- 如何存储默认值(当你生成初始配置的东西)
- 如何将配置存储在应用程序的外部(例如,在文件中)。
我的首选解决方案如下。
如何存储默认值
作为默认值,我假设它们不会经常更改,因此可以存储在代码中。存储值的方法有很多,我倾向于简单的:
public class DefaultValues
{
public static final String DEFAULT_VALUE_NAME_BLAMMY = "BLAMMY";
public static final String DEFAULT_VALUE_NAME_SMASHY = "SMASHY";
private static final String BLAMMY = "blam";
private static final String SMASHY = "smash";
// this map is optional and depends on the required complexity of your
// defaults
private static final Map<String, String> constants;
public DefaultValues()
{
Map<String, String> initialMap = new HashMap<String, String>();
constants.put(DEFAULT_VALUE_NAME_BLAMMY, BLAMMY);
constants.put(DEFAULT_VALUE_NAME_SMASHY, SMASHY);
constants = Collections.unmodifiableMap(initialMap);
}
// one way to get the default values; client of this class must know the
// default value names (exposed as publics from this class).
public String getDefaultValue(final String defaultValueName)
{
return constants.get(defaultValueName);
}
// another way to get default values; client does not need to know the
// default value names (no need for the publics if you use only this
// technique).
public Map<String, String> getDefaultValues()
{
return constants;
}
}
只在需要知道默认值时实例化一个新的DefaultValues()实例。
如何在应用程序的外部存储配置
我发现存储配置值最简单的方法是使用属性文件。如果您的配置很复杂,您可能需要一些更健壮的东西,比如XML文件。属性在属性JavaDocs中有很好的介绍。对于XML文件,我建议使用简单的SAX解析器。互联网上有很多SAX解析的好例子,试试Google搜索"sax解析器示例"
使用properties
文件存储在项目生命周期中可配置和可更改的内容。
在properties
文件中维护配置数据很容易,每个环境一个。
您可以根据DEV, QA, PROD等环境创建.properties
文件的不同副本