Java枚举详解

语法(定义)

创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum

public enum EnumTest {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

这段代码实际上调用了7次 Enum(String name, int ordinal):

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
    ... ...

遍历、switch 等常用操作

对enum进行遍历和switch的操作示例代码:

public class Test {
    public static void main(String[] args) {
        for (EnumTest e : EnumTest.values()) {
            System.out.println(e.toString());
        }

        System.out.println("----------------我是分隔线------------------");

        EnumTest test = EnumTest.TUE;
        switch (test) {
        case MON:
            System.out.println("今天是星期一");
            break;
        case TUE:
            System.out.println("今天是星期二");
            break;
        // ... ...
        default:
            System.out.println(test);
            break;
        }
    }
}

输出结果:

MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二

enum 对象的常用方法介绍

  • int compareTo(E o)
    • 比较此枚举与指定对象的顺序。
  • Class<E> getDeclaringClass()
    • 返回与此枚举常量的枚举类型相对应的 Class 对象。
  • String name()
    • 返回此枚举常量的名称,在其枚举声明中对其进行声明。
  • int ordinal()
    • 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
  • String toString()
    • 返回枚举常量的名称,它包含在声明中。
  • static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
    • 返回带指定名称的指定枚举类型的枚举常量。
public class Test1 {
    public static void main(String[] args) {
        EnumTest test = EnumTest.TUE;

        //compareTo(E o)
        switch (test.compareTo(EnumTest.MON)) {
        case -1:
            System.out.println("TUE 在 MON 之前");
            break;
        case 1:
            System.out.println("TUE 在 MON 之后");
            break;
        default:
            System.out.println("TUE 与 MON 在同一位置");
            break;
        }

        //getDeclaringClass()
        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());

        //name() 和  toString()
        System.out.println("name(): " + test.name());
        System.out.println("toString(): " + test.toString());

        //ordinal(), 返回值是从 0 开始
        System.out.println("ordinal(): " + test.ordinal());
    }
}

输出结果:

TUE 在 MON 之后
getDeclaringClass(): EnumTest
name(): TUE
toString(): TUE
ordinal(): 1

给 enum 自定义属性和方法

public enum EnumTest {
    MON(1),TUE(2),WED(3),THU(4),FRI(5),SAT(6){
        @Override
        public boolean isReset() {
            // TODO Auto-generated method stub
            return true;
        }
    },SUN(7){
        @Override
        public boolean isReset() {
            // TODO Auto-generated method stub
            return true;
        }
    };
    private int value;
    private EnumTest(int value){
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    public boolean isReset() {
        return false;
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println(EnumTest.SAT.getValue());
        System.out.println(EnumTest.FRI.isReset());
        System.out.println(EnumTest.SUN.isReset());
    }
}

输出结果:

6
false
true

EnumSet,EnumMap 的应用

public class Test {
    public static void main(String[] args) {
        // EnumSet的使用
        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
        for (EnumTest day : weekSet) {
            System.out.println(day);
        }

        // EnumMap的使用
        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
        weekMap.put(EnumTest.MON, "星期一");
        weekMap.put(EnumTest.TUE, "星期二");
        // ... ...
        for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
            Entry<EnumTest, String> entry = iter.next();
            System.out.println(entry.getKey().name() + ":" + entry.getValue());
        }
    }
}

原理分析

enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum。

public class com.hmw.test.EnumTest extends java.lang.Enum{
    public static final com.hmw.test.EnumTest MON;
    public static final com.hmw.test.EnumTest TUE;
    public static final com.hmw.test.EnumTest WED;
    public static final com.hmw.test.EnumTest THU;
    public static final com.hmw.test.EnumTest FRI;
    public static final com.hmw.test.EnumTest SAT;
    public static final com.hmw.test.EnumTest SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static com.hmw.test.EnumTest[] values();
    public static com.hmw.test.EnumTest valueOf(java.lang.String);
    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}

总结

可以把Enum看成Class,都含有成员变量和函数,只不过Enum的构造函数只能是私有函数,而且Enum里面有多个已经定义好的对象,枚举无法继承,因为编译器本身会将枚举类继承自Enum。

转载:http://www.cnblogs.com/hemingwang0902/archive/2011/12/29/2306263.html#title-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值