在具有不同数据类型的java中使用Enums

时间:2014-01-01 22:34:23

标签: java enums

为什么说在java中使用枚举更好。如果你有不同数据类型的常量,我认为最好使用带常量的类而不是枚举?

喜欢

Class A { 
    public static int A = 1;
    public static int B = 2;
    public static String c = "RADIUS";  
    public static String d = "LENGTH"; 
}

而不是

enum ofInts {A(1), B(2)}
enum ofStrings{c("RADUIS"), d("LENGTH")}

4 个答案:

答案 0 :(得分:7)

使用枚举的一个好处是它是强类型的。考虑两组常量,两者都有整数表示。如果您只是按照您的建议使用字段,那么没有什么可以阻止您将错误的值传递给方法等。如果使用枚举,则不能 - 两组常量完全不同,即使它们共享“具有基础整数表示的值”的常见方面。

当然,枚举提供了额外的好处,允许您包含值的行为,但这并不总是必要的 - 即使它不是,这并不意味着枚举没用。

答案 1 :(得分:1)

回答你的标题隐含的问题我们应该在不同数据类型的java中使用Enums吗?我必须回答一个响亮的没有,因为实际上你不能。枚举有自己的数据类型,每个enum本质上都是一种新的数据类型。这是他们最大的权力之一 - 他们可以在编译时进行强类型检查

你的问题的主体有点不公平 - 首先你永远不会考虑用枚举替换非决赛,所以让我们假装你发布:

class A {

    public static final int A = 1;
    public static final int B = 2;
    public static final String c = "RADIUS";
    public static final String d = "LENGTH";
}

我也可以对你的命名采取一些自由,使样本更加真实:

class A {

    public static final int ONE = 1;
    public static final int TWO = 2;
    public static final String RADIUS = "RADIUS";
    public static final String LENGTH = "LENGTH";
}

现在 - 自然地转换为enum

class A {
    enum Number {
        ZERO,
        ONE,
        TWO;

    }
    enum Measure {
        RADIUS,
        LENGTH,
        WEIGHT;

    }
}

我已经添加了更多值来证明由此产生的多功能性。

答案 2 :(得分:0)

通常,如果需要不同类型的枚举,则只需实现不同的枚举类型。具有int常量的类的不安全模式不被认为是好的风格(由于固有的不安全性)。

另一种选择可能是由Joshua Bloch发布的所谓的类型安全枚举模式。作为变体,您甚至可以构建类型层次结构。但这不适合初学者。例如,关于序列化,您需要特殊操作(使用readResolve-method)。

因此标准枚举非常易于使用且安全。

答案 3 :(得分:0)

枚举类型一方面使代码更加自我记录。根据语言的不同,编译器可以自动为枚举器分配默认值,从而隐藏程序员不必要的细节。这些值甚至可能对程序员不可见(封装)。

枚举的股票价值为0,1,2,3 ... N -1,N因此可以根据各自的位置进行参考。

Java和其他语言中的枚举类型也可以阻止程序员编写不合逻辑的代码,例如对枚举器的值执行数学运算。它更有条理。