JavaSE---列舉類
阿新 • • 發佈:2021-06-15
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、包含抽象方法的列舉類