1. 程式人生 > >Java枚舉

Java枚舉

protected etc 調用 構造 true tcl tex 而不是 one

Enum類源碼:

package java.lang;

import java.io.Serializable;
import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamException;

/**
 * 這是所有java語言枚舉類型的公共基類。 
 *
 *
 * 註意,當使用枚舉類型作為集合的類型時或者作為地圖中鍵的類型,專門且高效
 * {@linkplain java.util.EnumSet set} 和{
@linkplain * java.util.EnumMap map} 可以實現。 * * @param <E>枚舉類型的子類 * @author Josh Bloch * @author Neal Gafter * @see Class#getEnumConstants() * @see java.util.EnumSet * @see java.util.EnumMap * @since 1.5 */ public abstract class Enum<E extends Enum<E>> implements
Comparable<E>, Serializable { /** * 枚舉常量的名稱,在其枚舉聲明中對其進行聲明。 * 大多數程序員應該使用 {@link #toString} 方法而不是直接訪問此字段。 */ private final String name; /** * 返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。 * * 與此方法相比,大多數程序員應該優先考慮使用 toString() 方法,因為 toString 方法返回更加用戶友好的名稱。 * 該方法主要設計用於特殊情形,其正確性取決於獲取正確的名稱,其名稱不會隨版本的改變而改變。 * *
@return 返回此枚舉常量的名稱。 */ public final String name() { return name; } /** * 枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數為零)。 * * 大多數程序員不會使用此變量。它被設計用於復雜的基於枚舉的數據結構,比如 * {@link java.util.EnumSet} 和 {@link java.util.EnumMap}。 */ private final int ordinal; /** * 返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數為零)。 * * 大多數程序員不會使用此方法。它被設計用於復雜的基於枚舉的數據結構,比如 * {@link java.util.EnumSet} 和 {@link java.util.EnumMap}。 */ public final int ordinal() { return ordinal; } /** * 唯一的構造函數。程序員不能調用這個構造函數。它是利用由響應枚舉類型聲明編譯器產生的代碼。 * @param name - 此枚舉常量的名稱,它是用來聲明該常量的標識符。 * @param ordinal - 枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數為零)。 */ protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } /** * 返回枚舉常量的名稱,它包含在聲明中。可以重寫此方法,雖然一般來說沒有必要。當存在更加“程序員友好的”字符串形式時,應該使用枚舉類型重寫此方法。 * 覆蓋類 Object 中的 toString * * @return 枚舉常量的名稱 */ public String toString() { return name; } /** * 當指定對象等於此枚舉常量時,返回 true。 * 覆蓋類 Object 中的 equals * * @param other 要與此對象進行相等性比較的對象。 * @return 如果指定對象等於此枚舉常量,則返回 true。 */ public final boolean equals(Object other) { return this==other; } /** * 返回枚舉常量的哈希碼。 * 覆蓋類 Object 中的 hashCode * * @return 枚舉常量的哈希碼。 */ public final int hashCode() { return super.hashCode(); } /** * 拋出 CloneNotSupportedException。這可保證永遠不會復制枚舉,以保證枚舉是單例的。 * 覆蓋類 Object 中的clone * * @return (不返回) */ protected final Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException(); } /** * 比較此枚舉與指定對象的順序。在該對象小於、等於或大於指定對象時,分別返回負整數、零或正整數。 * 枚舉常量只能與相同枚舉類型的其他枚舉常量進行比較。該方法實現的自然順序就是聲明常量的順序。 * * */ 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; } /** * 返回與此枚舉常量的枚舉類型相對應的 Class 對象。當且僅當 e1.getDeclaringClass() == e2.getDeclaringClass() 時, * 兩個枚舉常量 e1 和 e2 的枚舉類型才相同。(由該方法返回的值不同於由 Object.getClass() 方法返回的值, Object.getClass() * 方法用於帶有特定常量的類主體的枚舉常量。) * * @return 與此枚舉常量的枚舉類型相對應的 Class 對象 */ @SuppressWarnings("unchecked") public final Class<E> getDeclaringClass() { Class<?> clazz = getClass(); Class<?> zuper = clazz.getSuperclass(); return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper; } /** * 返回帶指定名稱的指定枚舉類型的枚舉常量。名稱必須與在此類型中聲明枚舉常量所用的標識符完全匹配(不允許使用額外的空白字符)。 * * @param 要從中返回常量的枚舉類型的 Class 對象 * @param 要返回的常量名稱 * @return 帶指定名稱的指定枚舉類型的枚舉常量 * @throws IllegalArgumentException 如果指定枚舉類型不包含指定名稱的常量,或者指定類對象不表示枚舉類型 * @throws 如果 enumType 或 name 為空 * @since 1.5 */ 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); } /** * 枚舉類不能有 finalize 方法。 * 覆蓋類 Object 中的 finalize。 */ protected final void finalize() { } /** * 禁止反序列化 */ 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"); } }

Java枚舉