2008年5月12日 星期一

SCJP - 自修重點筆記與心得 (7)

<<1-5-5>>
Enums 的宣告
  • Java 5.0中的 enum (列舉清單)可以對變數的值加以限制,只能從列舉清單中選擇某一個值。使用 enum 可以減少程式內的臭蟲。
  • enum 可以被宣告成它自己的獨立類別,或類別成員,然而它們不能被宣告在函式內!
  • 若 enum 被宣告成獨立類別,則它只能使用 public 和預設的存取等級。
  • enum 宣告後面的分號,是非必須的
  • 每一個 enum 所列舉的項目,事實上都是 enum 的實體,可以在任何 enum 型別上,藉由呼叫 value() 這個函式,一一取出 enum 的值。
  • 宣告的範例如下:
    1. 獨立類別宣告~
      enum ClothesSize {S, M, L}; //可加分號

      class Clothes {
       ClothesSize size;
      }

      public class ClothesTest {
       public static void main(String[] args) {
        Clothes goods = new Clothes();
        goods.size = ClothesSize.M;
       }
      }
    2. 類別成員宣告~
      class Clothes {
       enum ClothesSize {S, M, L} //可不加分號
       ClothesSize size;
      }

      public class ClothesTest {
       public static void main(String[] args) {
        Clothes goods = new Clothes();
        goods.size = Clothes.ClothesSize.M;
       }
      }


宣告 enum 的建構子、函式和變數
  • 事實上,enum 是一種特殊的類別,所以除了可以利用它來列舉常數之外,還可以對它增加建構子、實體變數、函式和一些被稱為常數特定類別本體(constant specific class body)的非常奇怪的東西。
  • 例:
    enum ClothesSize {
     S(32), M(34), L(36);
     //會自動呼叫傳入 int 的建構子

     ClothesSize(int no) {
      this.no = no;
     }

     private int no;
     public int getNo() {
      return no;
     }
    }

    class Clothes {
     ClothesSize size;

     public static void main(String[] args) {
      Clothes goods1 = new Clothes();
      goods1.size = ClothesSize.S;

      Clothes goods2 = new Clothes();
      goods2.size = ClothesSize.M;

      System.out.println(goods1.size.getNo()); //會印出 32
      System.out.println(goods2.size.getNo()); //會印出 34
     }
    }
  • 絕對不可以直接呼叫 enum 的建構子。enum 的建構子是根據定義在常數後面的引數,而被自動呼叫的。
  • 可以定義 enum 建構子接受多個引數,也可以對它進行多載化的動作。
  • enum 可以定義一個非常奇怪的東西,看起來就像匿名內隱類別(anonymous inner class),它被稱為常數特定類別本體(constant specific class body),當希望某個特定的常數,多載化某個 enum 所定義的函式的時候會用到。
  • 例如當大部份 size 的衣服都是印上"?",只有 L-size 的衣服是印上"!",但又不想在取得圖案的函式中加入if/then的程式碼,所以就可以讓 L 這個常數多載 getPic() 這個函式,如下:
    enum ClothesSize {
     S(32),
     M(34),
     L(36) {
      public String getPic() { //多載在 ClothesSize 定義的函式
       return "!";
      }
     };

     ClothesSize(int no) {
      this.no = no;
     }

     private int no;
     public int getNo() {
      return no;
     }
     public String getPic() {
      return "?";
     }
    }


...以上 CHAPTER 1 結束

沒有留言: