1

我想在 Java 中使用 Enum 来存储不同环境的配置值。每个 Enum 将具有相同的字段,但值不同。就像是:

public enum DevelopmentConfig
{
   URL("..."),
   defaultURL(".....");
}

public enum ProductionConfig
{
   URL("..."),
   defaultURL(".....");
}

这是针对 Web 应用程序的,所以我不能简单地使用Preferences或任何其他解决方案。

我的问题是,有没有办法创建一个接口来定义配置的字段?或者我应该使用普通class而不是enum存储这些值?

编辑:要使用它,我只想从我的其他课程中做到这一点:

String url = Config.URL

或者

String url = Config.getURL();

不知道这是否指的是Config.DevelopmentConfig.Production(我希望在 Config 枚举的构造函数本身中确定它并让它选择正确的字段集)

4

3 回答 3

8

你在滥用枚举。

每个枚举成员都可以实现为覆盖事物的匿名类:

public enum Config {
    DEVELOPMENT {
        @Override
        ...
    },
    PRODUCTION {
        @Override 
        ...
    };

    public abstract ...;
}
于 2013-02-05T04:07:09.497 回答
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;
    }
}
于 2013-02-05T04:25:35.683 回答
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 中的键,而不是根据需要实现不同的类型。

编辑

您可以通过从应用程序运行环境(dev / prod / etc)中的某个位置读取 .property 文件来完成此操作,然后使用枚举键入属性文件:

//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);
}
于 2013-02-05T04:16:34.567 回答