如何在接口中使用Java枚举?

3

我希望在Java中使用枚举来存储不同环境的配置值。每个枚举都将具有相同的字段,但不同的值。类似于:

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枚举的构造函数本身中确定,并选择正确的字段集)。


枚举可以实现接口,如果这是你的问题。 - undefined
请问您能展示一下您打算如何使用它吗?枚举常量是静态的。您是否想在某个地方传递一个类? - undefined
@defaultlocale 我已经编辑了它,添加了一些更多的细节。 - undefined
3个回答

9
你在误用枚举。
每个枚举成员可以被实现为一个匿名类,该类可以覆盖一些东西:
public enum Config {
    DEVELOPMENT {
        @Override
        ...
    },
    PRODUCTION {
        @Override 
        ...
    };

    public abstract ...;
}

当我只想存储一个字符串或整数值时,将一切定义为类有什么用呢?我应该使用普通类吗? - undefined
我认为使用普通类会更好,因为在那里我还可以指定字段的数据类型。你有什么建议? - undefined
@ClickUpvote:您应将所有配置设置存储为枚举中的方法或最终字段。 - undefined
1
@ClickUpvote:就像我刚刚写的那样。创建一个抽象的url()方法。 - undefined

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;
    }
}

这还不错,但是如果我以后需要添加100个配置选项,我将需要通过构造函数提供100个参数。 - undefined
@ClickUpvote:这就是为什么你应该使用重写的抽象方法而不是。 - undefined

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/等)中的位置读取.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);
}

我想做的是有两组配置值,它们都有相同的字段但不同的值。然后在我的其他类中,我只想使用Config.URL,而不知道它是指向Config.DEV.URL还是Config.PRODUCTION.URL。你对此有什么建议? - undefined
我实际上已经用枚举与从.property文件中读取的属性进行了这个操作。 - undefined
问题在于,我在Netbeans中无法为字段使用自动完成,而这正是我想要的。你能告诉我如何通过枚举或常规类来实现这一点吗? - undefined
枚举、propertyManager和configurations都将自动完成。我不确定你在寻找什么。 - undefined
我觉得我在描述我想要的东西时相当清楚... 我甚至在问题的编辑中添加了一些代码示例。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接