为什么我会使用Enum,而不只是一个类?

Pur*_*ret 5 java enums

前几天我正在用Java帮助一个朋友,他们问的是Enums.我解释了C语法(类似的东西)

enumeration Difficulty{
    BEGINNER= 1;
    PRO=5;
    EXPERT = 11;
}
Run Code Online (Sandbox Code Playgroud)

不是要走的路,Java语法是something(1);你做了一个接受一个int的构造函数然后做了这个和那个......等等.

但是他们阻止了我并且问道:"如果我们使用构造函数等等,为什么还要使用枚举,为什么不只是有一个新的类?"

我无法回答.那么为什么你会在这种情况下使用枚举,而不是一个类?

Pla*_*ure 9

枚举严格限制.不可能在指定值之外定义枚举值(而使用类可以调用new以创建新值).

至少大多数JVM也对枚举进行了大量优化,并且还有新的类和语言功能,这些功能利用了枚举的紧凑性和速度.例如,有创造了新的类,EnumSet并且EnumMap,该实现使用一个bitset和阵列,分别(这可能是对于那些抽象数据类型的最快的可能的实现)的枚举键控集合或地图.

另外,枚举类型可以在switch语句中使用.如果您是Java1.7之前的版本,那么这是自定义switch语句的最佳选择(并且String由于类型安全性,仍然可能优于使用值;错误输入枚举值将导致编译时错误,但错误输入字符串将导致一个更阴险的运行时错误 - 或者更糟糕的是,在你真正盯着代码看错字之前你无法理解的逻辑错误.


Pet*_*rey 6

枚举具有平原类没有的许多功能.

  • 它们具有您在一个位置定义的固定数量的实例.
  • 它们可以用在switch语句中.
  • 获取完整的枚举列表
  • 从字符串中查找枚举.
  • 可以得到枚举的名称.
  • 可以子类枚举单个枚举值.


Lor*_*igs 6

嗯,实际上java中的Enum只是用于声明整个类层次结构的语法糖.

写作:

public enum MyEnum {
   FOO, BAR
}
Run Code Online (Sandbox Code Playgroud)

大致相当于写作

public abstract class MyEnum {
    public static final MyEnum FOO = new MyEnum(){};
    public static final MyEnum BAR = new MyEnum(){};

    private MyEnum(){}
}
Run Code Online (Sandbox Code Playgroud)

一开始看起来有点矫枉过正,但是你意识到你可以做所有类可以做的事情,例如:

public enum Operators {
    ADD("+"){ 
        public double apply(double lhs, double rhs){ return lhs + rhs; }
    },

    SUBTRACT("-"){ 
        public double apply(double lhs, double rhs){ return lhs - rhs; }
    },

    MULTIPLY("*"){ 
        public double apply(double lhs, double rhs){ return lhs * rhs; }
    },

    DIVIDE("/"){ 
        public double apply(double lhs, double rhs){ return lhs / rhs; }
    };

    private final String symbol;

    Operators(String symbol){
        this.symbol = symbol;
    }

    public abstract double apply(double lhs, double rhs);
}
Run Code Online (Sandbox Code Playgroud)

现在这相当于(加上一些额外的便利方法):

public abstract class Operators {
    public static final Operators ADD = new Operators("+"){ 
        public double apply(double lhs, double rhs){ return lhs + rhs; }
    };

    public static final Operators SUBTRACT = new Operators("-"){ 
        public double apply(double lhs, double rhs){ return lhs - rhs; }
    };

    public static final Operators MULTIPLY = new Operators("*"){ 
        public double apply(double lhs, double rhs){ return lhs * rhs; }
    },

    public static final Operators DIVIDE = new Operators("/"){ 
        public double apply(double lhs, double rhs){ return lhs / rhs; }
    };

    private final String symbol;

    private Operators(String symbol){
        this.symbol = symbol;
    }

    public abstract double apply(double lhs, double rhs);
}
Run Code Online (Sandbox Code Playgroud)

我相信我们能够达成一致意见比非常基本的C版本强大得多.当然,使用枚举可以保证枚举的每个成员都是单身.