enum类型定义
enum类型实际是一个类,继承自java.lang.Enum,编译器将enum类型单独编译成了一个字节码文件,枚举类型的枚举值都是常量即常见的public static final
的形式,因此枚举类中的枚举值最好全部大写。
定义一个enum类
public enum Color {
RED, GREEN, BLANK, YELLOW
}
可以看到编译后的class文件中将枚举值编译成了常量
public final class Color extends Enum
{
private Color(String s, int i){...}
public static Color[] values(){...}
public static Color valueOf(String s){...}
public static final Color RED;
public static final Color GREEN;
public static final Color BLANK;
public static final Color YELLOW;
private static final Color ENUM$VALUES[];
static
{
RED = new Color("RED", 0);
GREEN = new Color("GREEN", 1);
BLANK = new Color("BLANK", 2);
YELLOW = new Color("YELLOW", 3);
ENUM$VALUES = (new Color[] {
RED, GREEN, BLANK, YELLOW
});
}
既然是类,我们可以在Enum中定义构造器、方法、数据域,其中构造器一定是私有的,这样保证外部不能访问构造新的枚举值,但方法和数据域外部可以访问。
public enum Color {
RED(255, 0, 0), GREEN(0, 255, 0), BLANK(0, 0, 0), YELLOW(255, 255, 0);// 注意在末尾加分号
private int red;// 数据域定义
private int green;
private int blue;
private Color(int r, int g, int b) {//构造方法,私有
this.red = r;
this.green = g;
this.blue = b;
}
@Override
public String toString() {//重写父类toString
return "(" + red + "," + green + "," + blue + ")";
}
getter...setter...
}
所有的枚举类型都继承自Enum抽象类,该类中的方法
public final int ordinal()
返回枚举值在枚举类型的顺序Color.RED.ordinal()//0
,该顺序取决于定义的顺序
public final String name()
返回枚举值得字段值Color.RED.name()//RED
,为枚举值得字符串
public final int compareTo(E o)
实现了Comparable接口,返回两个枚举值之间的顺序之差Color.RED.compareTo(Color.BLANK)//-2
toString(),equal()比较两个枚举类型的引用使用==比较返回布尔值
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
与toString()方法对应,返回带指定名称的指定枚举类型的枚举常量Color.valueOf("RED")//(255,0,0)
返回为枚举值的toString返回
Color color = null;
switch (color) {
case RED:
break;
case GREEN:
break;
default:
break;
}
Enum类型可以用于switch判断。
public enum Color implements Serializable
Enum可以实现接口,Java单继承模式下因为已经继承了Enum类,所以不能继承。