1. 程式人生 > 其它 >列舉和註解

列舉和註解

列舉類Enumeration

定義:即直接把類具體的物件一個一個列舉出來,且是隻讀物件。

enumeration簡寫為enum。

實現方式:

  1. 自定義列舉

    • 將構造器私有化,防止new。

    • 可以提供get方法,但必須去掉set相關方法,防止屬性被修改。

    • 在其內部,直接創鍵固定物件。

    • 優化,可以再加入final修飾符,效率更高,不會導致類載入。

     //Season列舉類   只有四個固定物件,春夏秋冬
     public class Enumeration01 {
         public static void main(String[] args) {
             System.out.println(Season.SPRING);
             System.out.println(Season.WINTER);
        }
     }
     
     class Season{
         private String name;//季節名
         private String desc;//季節描述
     
         //定義需要物件
         public static Season SPRING = new Season("春天","溫暖");
         public static Season SUMMER = new Season("夏天","炎熱");
         public static Season AUTUMN = new Season("秋天","涼爽");
         public static Season WINTER = new Season("冬天","寒冷");
     
         //將構造器修改為private
         private Season(String name, String desc) {
             this.name = name;
             this.desc = desc;
        }
     
         public String getName() {
             return name;
        }
     
         public String getDesc() {
             return desc;
        }
     
         @Override
         public String toString() {
             return "Season{" +
                     "name='" + name + '\'' +
                     ", desc='" + desc + '\'' +
                     '}';
        }
     }
  2. 使用enum來實現列舉

    • 使用關鍵字 enum 替代 class

    • public static Season SPRING = new Season("春天","溫暖");

      直接用:SPRING("春天","溫暖") 代替 常量名(實參列表)

    • 如果有多個常量(物件),使用 , 間隔。最後一個帶 ;

    • 如果使用emun 來實現列舉類,要求將定義常量物件,寫在前面。

    • 如果我們使用無參構造器,則可以省略 () 。

     public class Test {
         public static void main(String[] args) {
             System.out.println(Season.SPRING);
             System.out.println(Season.WINTER);
        }
     }
     
     enum Season{
         //常量物件必須寫在類的最前面
         SPRING("春天","溫暖"),SUMMER("夏天","炎熱"),
         AUTUMN("秋天",
         private String name;//季節名
         private String desc;//季節描述
         private Season(String name, String desc) {
             this.name = name;
             this.desc = desc;
        }
     
      ...//get方法和toString
     }

Enum類

注意:在使用enum關鍵字時,會隱式繼承Enum類,因此在開發過程中,往往會使用Enum類的相關方法。如:name()、ordinal()、values() 注:此方法在Enum原始碼中隱藏 & 增強for、valueOf()、compareTo()

 public class EnumMethods {
     public static void main(String[] args) {
         //name()方法來自Enum類,作用: 返回類名
         System.out.println(Person.JACK.name());
         System.out.println(Person.JACK.getName());//注意 此name非彼name
 
         //ordinal()         作用:返回該物件次序(從0開始算)
         System.out.println(Person.JAY.ordinal());
 
         //values()         作用:放回一個物件陣列,次序同對象定義次序
         Person[] p = Person.values();
         for(Person person: p){//增強for迴圈
             // for(類名 自定義物件名 : 與類名相同陣列名) 從0序號賦值給物件名,直至陣列結束
             // 如:
             // int[] A = new int[10]; //...A賦值
             // for(int a : A)//每次迴圈從A陣列賦值給a,直至陣列賦值結束
             System.out.println(person);
        }
 
 
         //valueOf()     根據輸入的字串,判斷是否有列舉物件名字和該字串匹配
         //有則返回該物件,無則報錯
         Person peo = Person.valueOf("JAY");
         System.out.println(peo);
 
         //compareTo()   比較兩個同類列舉物件的次序,返回前一個的ordinal值 - 後一個
         //如:JACK是次序是0 LILY順序是3 則返回 -3
         System.out.println(Person.JACK.compareTo(Person.LILY));
 
    }
 }
 
 enum Person{
     JACK("傑克"),JAMES("詹姆斯"),JAY("周"),LILY("莉莉");
     private String name;
 
     Person(String name) {
         this.name = name;
    }
  ...//get toString  
 }

注意:

  1. 使用enum關鍵字後,無法繼承其他類。(因為enum預設隱式繼承了Enum類,且Java的類是單繼承機制)

  2. 列舉類可以實現介面


switch(); 可以用enum物件作用物件

 public class Homework08 {
     public static void main(String[] args) {
         Color color = Color.BLUE;
 
         //switch 可以使用enum類
         //在switch() 中,放入列舉物件
         //在每個case後,直接寫上列舉類中,定義的列舉物件
         switch (color) {
             case RED:
                 System.out.println("匹配到紅色");
                 break;
             case BLUE:
                 System.out.println("匹配到藍色");
                 break;
             default:
                 System.out.println("沒有匹配到");
        }
 
    }
 }
 
 interface IA {
     void show();
 }
 
 enum Color implements IA {
     RED(255, 0, 0), BLUE(0, 0, 255), BLACK(0, 0, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0);
 
 
     private int redValue;
     private int blueValue;
     private int greenValue;
 
     Color(int redValue, int blueValue, int greenValue) {
         this.redValue = redValue;
         this.blueValue = blueValue;
         this.greenValue = greenValue;
    }
 
     @Override
     public void show() {
         System.out.println(redValue + "," + greenValue + "," + blueValue);
    }
 }

 

註解Annotation

註解也被稱為元資料(Metadata),用於修飾解釋包、類、方法、屬性、構造器、區域性變數等資訊。註解不影響程式邏輯,但註解可以被編譯或執行。

JavaSE中,註解作用不大,但在JavaEE中,可以用來配置切面等。

@interface 即為一個註解類。

@Override

只能用於繼承的子類的方法上。

作用,如果加了該註解,編譯器就會判斷是否真的重寫了父類方法,如果的確重寫,則通過編譯,否則報錯。

@Target

修飾註解的註解,稱為元註解

@Deprecated

  1. 用於表示修飾某個元素已經過時了。

  2. 表示不再推薦使用,但是依舊可以使用。

  3. 可以修飾構造器、類、方法、包等(如@Target所示)

     @Documented
     @Retention(RetentionPolicy.RUNTIME)
     @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
     public @interface Deprecated {
     }
     
  4. 用處:用於版本過度,升級使用

@SuppressWarnings

用法:如 @SuppressWarnings({"unused","rawtypes"})

該註解用於抑制警告。

可用於{TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}。

 @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
 @Retention(RetentionPolicy.SOURCE)
 public @interface SuppressWarnings{...}

這裡給出一些常見的需要抑制的警告

  1. unchecked 忽略沒有檢查的警告

  2. rawtypes 忽略沒有指定泛型的警告

  3. unused 忽略沒有使用某個變數的警告

元註解

即用於修飾註解的註解。

  1. Retention (n. 保留;保持) //指定註解的作用範圍:SOURCE (編譯器使用後,即捨棄的註解)、CLASS (編譯器把該註解記錄在 .class 檔案中,執行前捨棄)、RUNTIME (編譯器把該註解記錄在 .class 檔案中,且執行時JVM也會保留該註解。故反編譯 .class 檔案時可以得到該註解)

  2. Target (n. 目標) //這個註解的使用範圍,即可以用於哪些地方

  3. Document (n. 檔案; v. 記錄) //該註解會使它修飾的註解,能在被javadoc提取成文件時,看到其修飾的註解。 如 @Deprecate 有被@Document修飾,則文件中會保留@Deprecate

  4. Inherited (v. 繼承) //使其修飾的 Annotation 具有繼承性。即某個類使用了被 @Inherited修飾的Annotation,則其子類將自動具有該註解

  5.