如何以正确的方式使用Enum?

时间:2012-12-13 07:16:19

标签: java enums

我非常喜欢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;
            }
        }
    }

枚举Environment包含三个常量DEVELOPMENTPRODUCTIONSANDBOXWeb课程还有baseUrl Environment baseUrl设置{不确定这是不错的做法。)

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

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

我不确定这是在类中使用枚举的正确方法。有没有办法直接将Web baseUrl设置为枚举baseUrl

我在这里遗漏了什么。

提前致谢

5 个答案:

答案 0 :(得分:3)

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

new Web().setEnvironment(Web.Environment.PRODUCTION);

现在,您只能将环境传递给Web类,而不是任何ol'字符串。

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

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

这样,我不能偶然来new Web().setEnvironment("marvo")。它强制执行一定程度的正确性。

vishal_aim是对的。即使使用Enums,您也应该练习数据隐藏和封装,因此请将实例变量设为私有,并提供getBaseUrl()等访问器来检索值。

答案 1 :(得分:2)

不要直接使用Enum的成员baseUrl,而应将其设为私有,并在枚举类中使用getter方法。除此之外,我认为以这种方式使用枚举是可以的

答案 2 :(得分:1)

使枚举成为顶级课程/枚举 为baseUrl字段添加一个getter。

答案 3 :(得分:1)

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

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

我会从Web类中取出Enum并省略Web类中冗余的'baseUrl'字段 - 您不需要它,因为您的Enum中有值。而不是baseUrl我会有一个类型为Environment的urlType成员。也很高兴将访问者方法添加到baseUrl枚举

中的Environment

答案 4 :(得分:0)

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

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