我想在Java中使用Enum来存储不同环境的配置值。每个枚举将具有相同的字段,但值不同。类似的东西:
public enum DevelopmentConfig
{
URL("..."),
defaultURL(".....");
}
public enum ProductionConfig
{
URL("..."),
defaultURL(".....");
}
这适用于Web应用程序,因此我不能简单地使用Preferences
或任何其他解决方案。
我的问题是,有没有办法创建一个界面来定义配置的字段?或者我应该使用普通class
代替enum
来存储这些值吗?
编辑:要使用此功能,我只想在其他课程中执行此操作:
String url = Config.URL
或者
String url = Config.getURL();
不知道是否引用Config.Development
或Config.Production
(我希望在Config枚举的构造函数中确定它并让它选择正确的字段集)
答案 0 :(得分:8)
你在滥用枚举。
每个枚举成员都可以实现为覆盖事物的匿名类:
public enum Config {
DEVELOPMENT {
@Override
...
},
PRODUCTION {
@Override
...
};
public abstract ...;
}
答案 1 :(得分:2)
您还可以通过以下方式使用枚举。使用此功能,您可以为每个配置存储(和检索)不同的值
public enum Config{
DEVELOPMENT("DEV_URL", "DEV_DEFAULT_URL"),
PRODUCTION("PROD_URL", "PROD_DEFAULT_URL");
private String url;
private String defaultURL;
Config( String url, String defaultURL )
{
setUrl(url);
setDefaultURL(defaultURL);
}
public String getUrl()
{
return url;
}
public String getDefaultURL()
{
return defaultURL;
}
public void setDefaultURL( String defaultURL )
{
this.defaultURL = defaultURL;
}
public void setUrl( String url )
{
this.url = url;
}
}
答案 2 :(得分:1)
枚举的每个成员都是枚举类的一个实例。这意味着您可以定义方法,变量和实现接口:
public interface Config {
String getKey();
}
public enum DevelopmentConfig implements Config
{
URL("url"),
DEFAULT_URL("defaulturl");
private String key;
private DevelopmentConfig(String key){
this.key = key;
}
public String getKey(){
return this.key;
}
}
如果您希望使用枚举来查找值,我建议您将它们用作Map中的键,而不是根据需要实现不同的类型。
修改强>
您可以通过从运行应用程序的环境中的某个位置读取.property文件来完成此操作(dev / prod / etc),然后使用枚举键入属性文件:
//This has reads in a property file:
PropertyManager propertyManager = new PropertyManager(/*prop file location*/);
String url = propertyManager.getConfig(DevelopmentConfig.URL);
PropertyManager的API如下所示:
PropertyManager {
String getConfig(Config config);
}