Java Enum 個人見解

MiracleCquan發表於2018-10-11

什麼是Enum?

  • Enum(列舉)。
  • 列舉是一種規範它規範了引數的形式,這樣就可以不用考慮型別的不匹配並且顯的替代了int 型引數可能帶來的模糊概念,列舉像一個類,又像一個陣列。
Enum 作為 Sun公司全新引進的一個關鍵字,看起來很象是特殊的class,它也可以有自己的變數,可以定義自己的方法,可以實現一個或者多個介面。 當我們在宣告一個enum型別時,我們應該注意到enum型別有如下的一些特徵。
  1. 它不能有public的建構函式,這樣做可以保證客戶程式碼沒有辦法新建一個enum的例項。
  2. 所有列舉值都是public , static , final的。注意這一點只是針對於列舉值,我們可以和在普通類裡面定義 變數一樣定義其它任何型別的非列舉變數,這些變數可以用任何你想用的修飾符。
  3. Enum預設實現了 java.lang.Comparable介面。
  4. Enum覆載了toString()方法,因此我們如果呼叫 ColorEnum.RED.toString()則預設返回字串 "RED"。
  5. Enum提供了一個valueOf()方法,這個方法和toString()方法是相對應的。呼叫valueOf("RED")則會預設返回ColorEnum.RED因此我們在自己重寫toString()方法的時候就要注意到這一點,一搬來說也會相對應地重寫valueOf()方法。
  6. 在比較兩個列舉型別的值時,永遠不需要呼叫equals方法,而直接使用"=="就可以了。(equals()方法也是直接使用 == , 兩者是一樣的效果)

Enum常見的方法

Enum是所有 Java 語言列舉型別的公共基本類(注意Enum是抽象類),以下是它的常見方法:

  1. compareTo(Enum e)    返回型別為  int    比較此列舉與指定物件的順序

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
    public static void main(String[] args){
        System.out.println("比較此列舉與指定物件的順序   為正則是大於對比下標位置序多少,為負則是小於他對比下標位置多少");
        System.out.println("YELLOW 對比 RED 位置順序結果為:" + EnumDemoOne.YELLOW.compareTo(enumDemoOne));
        System.out.println("RED 對比 YELLOW 位置順序結果為:" + EnumDemoOne.RED.compareTo(EnumDemoOne.YELLOW));
        /**
         * 比較此列舉與指定物件的順序   為正則是大於對比下標位置序多少,為負則是小於他對比下標位置多少
         * YELLOW 對比 RED 位置順序結果為:3
         * RED 對比 YELLOW 位置順序結果為:-3
         */
    }}
    
    
    複製程式碼

  2. equals(Object other)    返回型別  boolean    當指定物件等於此列舉常量時,返回true。

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
            System.out.println("當指定物件等於此列舉常量時,返回 true。");
            System.out.println("RED.toString() 對等於 RED.toString() 時" + EnumDemoOne.RED.toString().equals(enumDemoOne.toString()));
            System.out.println("RED 對等於 RED 時" + EnumDemoOne.RED.equals(enumDemoOne));
            System.out.println("YELLOW 對等於 BLANK 時" + EnumDemoOne.YELLOW.equals(EnumDemoOne.BLANK));
            System.out.println("YELLOW.name() 對等於 BLANK.name() 時" + EnumDemoOne.YELLOW.name().equals(EnumDemoOne.BLANK.name()));
           /**
    	 * 當指定物件等於此列舉常量時,返回 true。
    	 * RED.toString() 對等於 RED.toString() 時true
    	 * RED 對等於 RED 時true
    	 * YELLOW 對等於 BLANK 時false
    	 * YELLOW.name() 對等於 BLANK.name() 時false
    	 */
        }
    }複製程式碼

  3. getDeclaringClass()    返回型別  Class<?>    返回與此列舉常量的列舉型別相對應的 Class 物件

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
            System.out.println("返回與此列舉常量的列舉型別相對應的 Class 物件");
    	System.out.println("RED 的列舉常量相對應的型別是:" + EnumDemoOne.RED.getDeclaringClass());
    	/**
    	 * 返回與此列舉常量的列舉型別相對應的 Class 物件
    	 * RED 的列舉常量相對應的型別是:class com.chenquan.demo.enum_demo.EnumDemoOne	
    	 */
        }
    }複製程式碼

  4. name()    返回型別  String    返回此列舉常量的名稱,在其列舉宣告中對其進行宣告

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
           System.out.println("name() 返回此列舉常量的名稱,在其列舉宣告中對其進行宣告\t" + EnumDemoOne.RED.name());
           /**
            * name() 返回此列舉常量的名稱,在其列舉宣告中對其進行宣告	RED
            */
        }
    }複製程式碼

  5. toString()    返回型別 String    返回列舉常量的名稱,它包含在宣告中。我們在上文中提到:了Enum覆載了toString()方法,因此我們如果呼叫 ColorEnum.RED.toString()則預設返回字串 "RED"。 可以發現。通過檢視原始碼發現toString()name()方法其實都是返回Enum常量的名字

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
          System.out.println("toString() 返回列舉常量的名稱,它包含在宣告中\t" + EnumDemoOne.RED.toString());
           /**
            * toString() 返回列舉常量的名稱,它包含在宣告中	RED
            */
        }
    }複製程式碼
  6. ordinal()    返回型別  int    返回列舉常量的序數(它在列舉宣告中的位置,其中初始常量序數為零) 該方法獲取的是列舉變數在列舉類中宣告的順序,下標從0開始 在宣告列舉的時候下標就會自己產生。

    public enum EnumDemoOne {
    	RED, GREEND, BLANK, YELLOW
    }
    
    
    public class EnumTestOne {
        EnumDemoOne enumDemoOne = EnumDemoOne.RED;
    
        public static void main(String[] args){
           System.out.println("ordinal() 得到列舉型別建立的順序\t" + EnumDemoOne.RED.ordinal());
           System.out.println("ordinal() 得到列舉型別建立的順序\t" + EnumDemoOne.GREEND.ordinal());
           /**
            * ordinal() 得到列舉型別建立的順序	0
            * ordinal() 得到列舉型別建立的順序	1
            */
        }
    }複製程式碼

  7. static valueOf(Class<T> enumType, String name) 靜態方法  放回型別  static<T extends Enum<T>> T    返回帶指定名稱的指定列舉型別的列舉常量。

public enum EnumDemoOne {
	RED, GREEND, BLANK, YELLOW
}


public class EnumTestOne {
    EnumDemoOne enumDemoOne = EnumDemoOne.RED;

    public static void main(String[] args){
        System.out.println("得到指定名稱的常量名:" + EnumDemoOne.valueOf("RED"));
	System.out.println("得到指定名稱的常量名:" + EnumDemoOne.valueOf("BLANK"));
	System.out.println("得到指定名稱的常量名:" + EnumDemoOne.valueOf("YELLOW"));	
	/**
	 * 得到指定名稱的常量名:RED
	 * 得到指定名稱的常量名:BLANK
	 * 得到指定名稱的常量名:YELLOW
	 */
    }
}複製程式碼



Enum一般做什麼用?

  • 常量
        在以前Java SE5 之前,定義常量都是 public static final String RED; 有了列舉,就可            以把相關的常量分組到一個列舉型別裡,而且列舉提供了比常量更多的方法。

/**顏色*/
public enum ColorEnum{
	RED, GREEND, BLANK, YELLOW;
}複製程式碼

/**星期*/
public enum WeekDayEnum{
     MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}複製程式碼

  • switch

        在JDK1.6之前switch迴圈只支援 int,char,enum。雖然在JDK1.7開始 加入了 String            型別但是使用列舉能讓我們的程式碼可讀性更強。而且列舉提供了比常量更多的方法。

public enum EnumDemoOne {
	RED, GREEND, BLANK, YELLOW;	
}

public class EnumTestOne {
	EnumDemoOne enumDemoOne = EnumDemoOne.RED;
	
	public void changeSwtich(){
		switch (enumDemoOne) {
		case RED:
			System.out.println(EnumDemoOne.RED + " 這是紅色");
			break;
		case GREEND:
			System.out.println(EnumDemoOne.GREEND + " 這是綠色");
			break;
		case BLANK:
			System.out.println(EnumDemoOne.BLANK + " 這是白色");
			break;
		case YELLOW:
			System.out.println(EnumDemoOne.YELLOW + " 這是黃色");
			break;
		}
	}
}複製程式碼
  • 向enum類新增方法與自定義建構函式

              我們可以自己給Enum新增屬性和方法。在新增時必須注意一點。必須要在定義完的                  列舉後面加上分號;

public enum EnumDemoSecond{
	RED("紅"), GREEND("綠"), BLANK("白"), YELLOW("黃");
	
	private String description;

	// 構造方法
	private EnumDemoSecond(String description) {
		this.description = description;
	}
	
	/** set()方法  private 是為了防止外部隨意呼叫修改*/
	private void setDescription(String description){
		this.description = description;
	}
	
	/** get()方法*/
	public String getDescription() {
		return description;
	}

	/**
	 * 重寫 toString() 方法,讓他返回的是屬性的值
	 * */
	@Override
	public String toString() {
		return this.description;
	}


        public static void main(String[] args){
		
		/**
		 * 在重寫 toString() 方法以前,toString() 和 name() 都是返回此列舉常量的名稱 
		 * 但是現在重寫了 toString()方法。返回的是自己定義的屬性名稱
		 * */
		for (EnumDemoSecond en : EnumDemoSecond.values()) {
			System.out.println("Enum常量名:" + en.name() + "\t Enum的自定義屬性名:" + en.toString() );
		}
		/**
		 * Enum常量名:RED	 Enum的自定義屬性名:紅
		 * Enum常量名:GREEND	 Enum的自定義屬性名:綠
		 * Enum常量名:BLANK	 Enum的自定義屬性名:白
		 * Enum常量名:YELLOW	 Enum的自定義屬性名:黃
		 */
	
	}

}複製程式碼

這是博主第一次開始學著寫部落格。。 寫出了博主目前理解了的 內容。

本文許多內容出自: blog.csdn.net/javazejian/…  

如有理解錯誤地方請各位大佬指導。


相關文章