1. 程式人生 > 其它 >JavaSE---列舉類

JavaSE---列舉類

1、Why?為什麼要有列舉類?

    a, 手動實現列舉類,程式碼量較大,實現比較麻煩;

    b, 使用常量表示 列舉,存在的問題:

      型別不安全;物件的意義不明確;

private static final int SPRING = 1;// 春天
    private static final int SUMMER = 2;// 夏天

2、What?

    2.1、JDK5後 ,Java提供了enum關鍵字;

    2.2、列舉類 與 普通類的區別:

        a, 使用enum定義的類 預設繼承java.lang.Enum類,不是Object;

        b, 列舉類的構造器 只能使用private修飾,如果省略了修飾符,預設使用private;

        c, 列舉類的所有例項必須顯式指出,例項預設會新增 public static fianl,無需顯式指定;

        d, 所有列舉類都提供一個values(),很方便的遍歷所有的列舉值;

3、How?

    3.1、所有 列舉值之間使用 英文逗號 分隔,列舉值結束 用 英文分號 結束

    3.2、switch中使用列舉,只需要 使用列舉值的名字,無需新增列舉類作為限定;

public enum EnumTest {

    SPRING,SUMMER;

}



import static com.an.EnumTest.SPRING;

public class Test {

   public static void main(String[] args) {
      EnumTest o= null ;

        switch (o){
            case SPRING :
                break;
        }
   }

}    

4、Enum類

    4.1、Java中所有的列舉類 預設都繼承 Enum類;

    4.2、Eunm實現了Comparable、Serializable 2個介面;

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {

    // 列舉值常量的名稱,程式設計師應該使用toString(),避免直接訪問name欄位
    private final String name;

    // 列舉值常量的序號
    private final int ordinal;

    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }

    public final String name() {
        return name;
    }

    public final int ordinal() {
        return ordinal;
    }

    public String toString() {
        return name;
    }

    public final boolean equals(Object other) {
        return this==other;
    }

    public final int hashCode() {
        return super.hashCode();
    }

    public final int compareTo(E o) {
        Enum<?> other = (Enum<?>)o;
        Enum<E> self = this;
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }

    public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
        T result = enumType.enumConstantDirectory().get(name);
        if (result != null)
            return result;
        if (name == null)
            throw new NullPointerException("Name is null");
        throw new IllegalArgumentException(
            "No enum constant " + enumType.getCanonicalName() + "." + name);
    }

    private void readObject(ObjectInputStream in) throws IOException,
        ClassNotFoundException {
        throw new InvalidObjectException("can't deserialize enum");
    }

    private void readObjectNoData() throws ObjectStreamException {
        throw new InvalidObjectException("can't deserialize enum");
    }

}

5、實現介面的列舉類

6、包含抽象方法的列舉類