Java 如何正确使用Enum?

Java 如何正确使用Enum?,java,enums,Java,Enums,我对Java非常熟悉,我第一次使用enum时是这样: public class Web { public String baseUrl; public static enum Environment { DEVELOPMENT("http://development") , PRODUCTION("http://production"), SANDBOX("http://sandbo

我对Java非常熟悉,我第一次使用enum时是这样:

    public class Web {
        public String baseUrl;
        public static enum Environment {

            DEVELOPMENT("http://development") ,
            PRODUCTION("http://production"),
            SANDBOX("http://sandbox");

            public final String baseUrl;

            private Environment(String baseUrl)
            {
                this.baseUrl = baseUrl;
            }
        }
    }
public void setEnvironment(Environment environment) {
    this.baseUrl = environment.getBaseUrl();
}
枚举
环境
有三个常量
开发
生产
沙箱
Web
类还具有
baseUrl
,要将
环境
baseUrl
设置到该类(不确定这样做是否是好的做法)

对于设置
baseUrl
,我目前正在这样做:

new Web().setBaseUrl(Web.Environment.PRODUCTION.baseUrl)
我不确定这是将枚举用于类的正确方法。有没有办法直接将
Web
baseUrl
设置为枚举
baseUrl

我是不是遗漏了什么


提前感谢

而不是直接使用Enum的成员
baseUrl
您应该将其设置为私有,并在Enum类中使用getter方法。除此之外,我认为可以这样使用enum

使enum成为顶级类/enum。

为baseUrl字段添加一个getter

我认为您的思路是正确的,但是通过这种方式访问URL,您正在失去Java枚举的一些优势。相反,请使用枚举的类型来帮助确保向方法传递正确的值。也就是说,单独传递枚举,让方法从中提取任何值。例如:

new Web().setEnvironment(Web.Environment.PRODUCTION);
现在,您只能将环境传递给Web类,而不是任何ol'字符串

[编辑]然后您的Web.setEnvironment方法如下所示:

    public class Web {
        public String baseUrl;
        public static enum Environment {

            DEVELOPMENT("http://development") ,
            PRODUCTION("http://production"),
            SANDBOX("http://sandbox");

            public final String baseUrl;

            private Environment(String baseUrl)
            {
                this.baseUrl = baseUrl;
            }
        }
    }
public void setEnvironment(Environment environment) {
    this.baseUrl = environment.getBaseUrl();
}
这样的话,我就不能不经意间打电话给
newweb().setEnvironment(“marvo”)
。它强制执行一定程度的正确性


vishal_的目标是正确的。即使使用Enum,您也应该练习数据隐藏和封装,因此将实例变量设为私有,并提供一个访问器,如getBaseUrl()来检索值。

我认为如何使用Enum没有问题。但是,代码看起来有点笨拙:

new Web().setBaseUrl(Web.Environment.PRODUCTION.baseUrl)

我会将枚举从
Web
类中取出,并省略
Web
类中多余的“baseUrl”字段-您不需要它,因为您的枚举中有值。我将使用
Environment
类型的urlType成员,而不是
baseUrl
。另外,最好将访问器方法添加到
环境中的
baseUrl
enum

以及Bohemian和vishal_aim所说的,您可能会不必要地公开baseUrl成员(或在中重构后的getBaseUrl()方法)。而是将枚举传递给Web类,让它从枚举中挖掘URL。这样,如果将枚举保持在Web类中,则可以将baseUrl保持为私有

public void setEnvironment(Environment env) {
    baseUrl = env.getBaseUrl();
    ....
}

但是如果它只在
Web
类中使用,那么在这个类中声明它有什么害处呢?@vishal\u aim我严重怀疑这将是唯一的用途。测试类、心跳进程可能希望在使用完整URL之前ping服务器,etcThanks用于回复。如果我通过了
Web.Environment.PRODUCTION
。我只得到了
产品
作为输出,而不是
url
。我添加了更多的解释来说明我的意思。希望有帮助。谢谢。这真的帮助了我。