[Java] 10.2. 列舉的建構式 & 屬性 & 方法

列舉也可以有建構式、屬性與方法。

 

image/svg+xml10.2. 建構式、屬性、⽅法 Constructor Attribute Function enum EmployeeType { Programmer ( " 程式設計師 " ), Artist ( " 美⼯⼈員 " ), Tester ( " 測試⼈員 " ) ; String chineseName = "" ; EmployeeType ( String chName){ chineseName = chName; } double getBonusRate (){ return 2 ; } } class Main{ public static void main( String [] args){ EmployeeType e1 = EmployeeType. Programmer ; EmployeeType e2 = EmployeeType.Artist; EmployeeType e3 = EmployeeType.Tester; System.out.println( e1 . chineseName ); System.out.println(e2.chineseName); System.out.println(e3.chineseName); System.out.println( e1 . getBonusRate ()); System.out.println(e2.getBonusRate()); System.out.println(e3.getBonusRate()); } } 執⾏結果 程式設計師 美⼯⼈員 測試⼈員 2.0 2.0 2.0 enum EmployeeType { Programmer ( " 程式設計師 " ) { double getBonusRate (){ return 3 ; } } , Artist( " 美⼯⼈員 " ), Tester( " 測試⼈員 " ) ; String chineseName = "" ; EmployeeType( String chName){ chineseName = chName; } double getBonusRate (){ return 2 ; } } class Main { public static void main( String [] args){ EmployeeType e1 = EmployeeType . Programmer ; EmployeeType e2 = EmployeeType.Programmer; System.out.println( e1 . chineseName ); System.out.println(e2.chineseName); EmployeeType. Programmer.chineseName = " 程式設計師 2 " ; System.out.println( e1 . chineseName ); System.out.println(e2.chineseName); System.out.println(EmployeeType. Programmer.getBonusRate ()); } } enum EmployeeType { String chineseName = ""; EmployeeType ( String chName){ chineseName = chName; } double getBonusRate (){ return 2 ; } Programmer ( " 程式設計師 " ), Artist ( " 美⼯⼈員 " ), Tester ( " 測試⼈員 " ); } 編譯失敗 EmployeeType.java:3: error: ',', '}', or ';' expected String chineseName = ""; ^ EmployeeType.java:3: error: '}' expected String chineseName = ""; ^ EmployeeType.java:5: error: class, interface, or enum expected EmployeeType(String chName){ ^ EmployeeType.java:7: error: class, interface, or enum expected } ^ EmployeeType.java:10: error: class, interface, or enum expected } ^ EmployeeType.java:16: error: class, interface, or enum expected } ^ 6 errors J10_2_1 - EmployeeType.java 1. 這是員⼯類型列舉( EmployeeType )。 J10_2_2 - EmployeeType.java 1. 這是員⼯類型列舉( EmployeeType )。 2. 同樣列出列舉的選項,不 同的是這些選項會使⽤⼩括號 () )直接呼叫建構式。 3. 需要特別注意的是當列舉即將擁 有建構式、屬性或⽅法時,必須加上 分號( ; )表⽰宣告選項的結束。 4. 這是中⽂名稱屬性( chineseName ), 將⽤來保存每個選項的中⽂名稱。 5. 這是建構式,會傳入⼀個參數以代入每個選項的中⽂ 名稱⾄中⽂名稱屬性中。⽽呼叫建構式的⽅式,是在宣告 員⼯類型列舉中的選項時,同時使⽤⼩括號進⾏呼叫。 6. 當然,列舉上⾯也可以擁有⽅法,在此建立⼀個 取得獎⾦乘數⽅法( getBounsRate() )以取得每 種員⼯類型應有的獎⾦乘數,⽬前先預設為2。 7. 當第⼀次取得員⼯類型列舉中的選項時(如: Programmer ),建構式會被呼叫。 8. 使⽤選項中的中⽂名稱屬性( chineseName 以取得中⽂名稱,其值會在建構式呼叫時被設定。 9. 使⽤取得獎⾦乘數⽅法( getBounsRate() )取得每 ⼀個選項的狀⾦乘數,⽬前得到的值皆是預設的值 - 2。 J10_2_1 - Main.java 2. 若要改寫⽅法,則必須準備程式區塊(即⼤括號( {} )), 並將它加在列舉的某個選項後⽅,如: Programmer 3. 改寫的⽅法取得獎⾦乘數⽅法( getBounsRate() 必須存在於列舉中,以便找到即有的⽅法進⾏改寫。在此 我們針對程式設計師選項,將獎⾦乘數改成3。 J10_2_3 - Main.java 1. 在此先取得 2 份程式設計師選項( Programmer ), 並確認它們擁有相同的中⽂名稱( chineseName )。 2. 因為靜態化( static )的特性,因此可以直接透過程式設計選 項進⾏中⽂名稱屬性( chineseName )的存取與設定,同時透過先 前取得⾄ e1 e2 變數中的程式設計師選項,證名中⽂名稱屬性只存 在⼀份,其取得的值皆會是變更後的 程式設計師2代 3. 當然,也因為⽅法也是靜態化的原故,因此可以透過程式設計 師選項,直接呼叫取得獎⾦乘數⽅法( getBonusRate() )。 其實編譯器會在編譯的時候將列舉轉換成類別的⽅式表⽰,同時應⽤內隱類 別的⼿法(第 16 類別中的類別 - 內隱類別會加以說明),來表⽰列舉中的 選項。 J10_2_4 - EmployeeType.java 3. 因為員⼯類型列舉中的選預,被移⾄到建構式、屬 性與⽅法的後⽅的原故,此實會發⽣編譯失敗的問題, 原因是列舉的選預必須在列舉中優先定義,⽽後才是建 構式、屬性或⽅法,否則將發⽣編譯失敗的問題。 1. 這是員⼯類型列舉( EmployeeType )。 2. 這是員⼯類型列舉中的選預,其被 移⾄到建構式、屬性與⽅法的後⽅。 員⼯類型列舉也可以擁有建構式、屬性與⽅法 改寫,改變獎⾦乘數 靜態化,為列舉的設計理念 注意,列舉上的選項必需於建構式、 屬性或⽅法前宣告 1 2 3 4 5 6 1 2 3 4 5 6 1 1

留言