枚舉和注解
-枚舉
-
規定多選一數據類型的解決方案-枚舉
- 枚舉對應英文(enumeration,簡寫 enum)
2)枚舉是一組常量的集合。
3)可以這里理解:枚舉屬于一種特殊的類,里面只包含一組有限的特定的對象。
- 枚舉對應英文(enumeration,簡寫 enum)
-
枚舉的兩種實現方式
-
自定義實現枚舉
-
使用enum關鍵字實現枚舉
-
-
自定義類實現枚舉
-
不需要提供setXxx 方法,因為枚舉對象值通常為只讀.
-
對枚舉對象/屬性使用 final + static 共同修飾,實現底層優化
-
枚舉對象名通常使用全部大寫,常量的命名規范
-
枚舉對象根據需要,也可以有多個屬性
-
-
自定義類實現枚舉小結
-
小結:進行自定義類實現枚舉,有如下特點:
-
-
構造器私有化
-
本類內部創建一組對象
-
對外暴露對象(通過為對象添加public final static修飾符)
-
可以提供 get方法,但是不要提供 set
-
-
-enum枚舉類
-
enum關鍵字實現枚舉注意事項
-
當我們使用enum關鍵字開發一個枚舉類時,默認會繼承Enum類,而且是一個final類,用javap(反編譯 )工具可以驗證
-
傳統的public static final Season2 SPRING = new Season2(“春天”,“溫暖”);簡化成SPRING(“春天”,“溫暖”),這里必須知道,它調用的是哪個構造器。
-
如果使用無參構造器創建枚舉對象,則實參列表和小括號都可以省略
-
當有多個枚舉對象時,使用","間隔,最后一個分號結尾
-
枚舉對象必須放在枚舉類的行首
-
-
enum常用方法說明
說明:使用enum關鍵字時,會隱式繼承Enum類,這樣我們就可以使用Enum類相關方法。(看以下源碼定義)
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable{}
- toString:Enum類已經重寫該方法,返回的是當前對象名,子類可以重寫該方法,用于返回對象的屬性信息
- name:可以返回當前對象名(常量名),子類中不能重寫
- oridnal:返回當前對象的位置號,默認從0開始
- values:返回當前枚舉類中所有常量
- valuesOf:將字符串轉換成枚舉對象,要求字符串必須為已有常量名,否則報異常
- compareTo:比較兩個枚舉常量,比較的就是編號
package com.xijie.enum_;/*** 演示Enum枚舉的使用* 記錄紅綠燈顏色、時間、說明的枚舉*/ public enum TrafficLightEnum {//枚舉對象,訪問權限是私有、類成員、常量,實現了抽象方法GREEN(30,"綠燈代表可以通行"){@Overridepublic String getAction() {return "請通行";}},YELLOW(3,"黃燈代表準備剎車") {@Overridepublic String getAction() {return "請剎車";}},RED(35,"紅燈代表禁止通行") {@Overridepublic String getAction() {return "請停車";}};//私有常量成員變量private final int durationTime;private final String info;//私有構造方法TrafficLightEnum(int durationTime, String info) {//信號燈時間this.durationTime = durationTime;this.info = info;}//get方法public int getDurationTime() {return durationTime;}public String getInfo() {return info;}//抽象方法,由枚舉對象實現public abstract String getAction(); }
package com.xijie.enum_;public class TrafficLightEnumTest {public static void main(String[] args) {//TrafficLightEnum枚舉類的基本使用TrafficLightEnum greenLight = TrafficLightEnum.GREEN;TrafficLightEnum greenLight2 = TrafficLightEnum.GREEN;TrafficLightEnum yellowLight = TrafficLightEnum.YELLOW;TrafficLightEnum redLight = TrafficLightEnum.RED;//比較兩個綠燈是否相同System.out.println("兩個綠燈是否相同:"+(greenLight==greenLight2));//比較紅燈和黃燈是否相同System.out.println("紅燈和黃燈是否相同:"+(redLight==yellowLight));//訪問黃燈的所有成員及自定義方法System.out.println("黃燈的名字叫:"+yellowLight.name());System.out.println("黃燈的意思是:"+yellowLight.getInfo());System.out.println("黃燈亮時應該:"+yellowLight.getAction());//enum方法演示//toString:Enum類已經重寫該方法,返回的是當前對象名,子類可以重寫該方法,用于返回對象的屬性信息System.out.println("綠燈的名字是"+greenLight.toString());System.out.println("黃燈的名字是"+yellowLight.toString());System.out.println("紅燈的名字是"+redLight.toString());//name:可以返回當前對象名(常量名),子類中不能重寫System.out.println("綠燈的常量名是"+greenLight.name());System.out.println("黃燈的常量名是"+yellowLight.name());System.out.println("紅燈的常量名是"+redLight.name());//oridnal:返回當前對象的位置號,默認從0開始System.out.println("綠燈的位置號是"+greenLight.ordinal());System.out.println("黃燈的位置號是"+yellowLight.ordinal());System.out.println("紅燈的位置號是"+redLight.ordinal());//values:返回當前枚舉類中所有常量TrafficLightEnum[] enums = TrafficLightEnum.values();for(TrafficLightEnum e:enums){System.out.println(e.name());}//valuesOf:將字符串轉換成枚舉對象,要求字符串必須為已有常量名,否則報異常String redStr="RED";TrafficLightEnum red = TrafficLightEnum.valueOf(redStr);System.out.println("字符串轉換為枚舉對象:"+red.name());//compareTo:比較兩個枚舉常量,比較的就是編號System.out.println("比較綠燈和綠燈:"+greenLight.compareTo(greenLight2));System.out.println("比較黃燈和紅燈:"+yellowLight.compareTo(redLight));System.out.println("比較紅燈和黃燈:"+redLight.compareTo(yellowLight));System.out.println("比較紅燈和綠燈:"+redLight.compareTo(greenLight));} }
-
一個練習-用三種方法定義枚舉常量的別名
package com.xijie.enum_;public enum DayOfWeekEnum {//重寫toString方法也可以返回自定義字符串MONDAY("星期一"){@Overridepublic String getChineseNameOfTheDay() {return "星期一";}@Overridepublic String toString() {return "星期一";}},TUESDAY("星期二"){@Overridepublic String getChineseNameOfTheDay() {return "星期二";}@Overridepublic String toString() {return "星期二";}},WEDNESDAY("星期三"){@Overridepublic String getChineseNameOfTheDay() {return "星期三";}@Overridepublic String toString() {return "星期三";}},THURSDAY("星期四"){@Overridepublic String getChineseNameOfTheDay() {return "星期四";}@Overridepublic String toString() {return "星期四";}},FRIDAY("星期五"){@Overridepublic String getChineseNameOfTheDay() {return "星期五";}@Overridepublic String toString() {return "星期五";}},SATURDAY("星期六"){@Overridepublic String getChineseNameOfTheDay() {return "星期六";}@Overridepublic String toString() {return "星期六";}},SUNDAY("星期天"){@Overridepublic String getChineseNameOfTheDay() {return "星期天";}@Overridepublic String toString() {return "星期天";}},;//存儲星期日期的中文名稱private final String chineseName;DayOfWeekEnum(String chineseName) {this.chineseName=chineseName;}//get方法public String getChineseName() {return chineseName;}//使用抽象方法也可以起到同樣的效果public abstract String getChineseNameOfTheDay(); }
?
package com.xijie.enum_;public class DayOfWeekTest {public static void main(String[] args) {//通過獲取枚舉對象的成員方法獲取自定義星期名稱System.out.println("==所有星期的信息如下==");for (DayOfWeekEnum dayEnum : DayOfWeekEnum.values()) {System.out.println(dayEnum.getChineseName());}//通過自定義抽象方法獲取自定義星期名稱System.out.println("==所有星期的信息如下==");for (DayOfWeekEnum dayEnum : DayOfWeekEnum.values()) {System.out.println(dayEnum.getChineseNameOfTheDay());}//通過重寫的toString方法獲取自定義星期名稱System.out.println("==所有星期的信息如下==");for (DayOfWeekEnum dayEnum : DayOfWeekEnum.values()) {System.out.println(dayEnum);}}
}
-
枚舉類的注意事項
1.使用enum關鍵字后,就不能再繼承其他類了,因為enum會隱式繼承Enum,而Java是單繼承機制
2.枚舉類和普通類一樣,可以實現接口,如下形式:
enum 類名 implements 接口1, 接口2...{}
-注解
-
注解的理解
- 注解(Annotation)也被稱為元數據(Metadata),用于修飾解釋包、類、方法、屬性、構造器、局部變量等數據信息。
- 和注釋一樣,注解不影響程序邏輯,但注解可以被編譯或運行,相當于嵌入在代碼中的補充信息。
- 在JavaSE中,注解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE中注解占據了更重要的角色,例如用來配置應用程序的任何切面,代替javaEE舊版中所遺留的繁冗代碼和XML配置等。
-
基本的Annotation介紹
使用Annotation時要在其前面增加@符號,并把該Annotation當成一個修飾符使用。用于修飾它支持的程序元素
- 三個基本的Annotation
- @Override:限定某個方法,是重寫父類方法,該注解只能用于方法
- @Deprecated:用于表示某個程序元素(類,方法等)已經過時
- @SuppressWarnings:抑制編譯器警告
- 三個基本的Annotation
-
@Override簡介
- @Override限定某個方法是重寫了父類方法,該注解只能用于方法,不能修飾類、包、屬性等
- @Override注解寫在方法上方
- 如果沒有寫@Override,該重寫還是會重寫
- 如果寫了@Override注解,編譯器在編譯時就會檢查該方法是否真的重寫了父類方法,如果沒有重寫就會報錯。
- 在@Override的定義中,@interface表示一個注解類,和interface表示接口不一樣;@Target(ElementType.METHOD)表示該注解只能修飾方法;@Target是修飾注解的注解,是元注解。
-
@Deprecated簡介
- @Deprecated注解表示某個程序的元素,比如方法、類已經過時了
- 但是該過時的元素還是可以用的,只是不推薦使用
- 通過查看@Deprecated的定義,可以知道該注解可用于構造器、成員變量、局部變量、方法、包、參數、類型。
- @Deprecated可以用于新老元素的過渡,比如將jdk8升級到jdk11時,可以將舊的類注解,推薦使用新的類。
-
@SupressWarnings簡介
-
當我們不希望看到編譯器警告的時候,可以使用@SupressWarnings注解來抑制警告信息
-
語法:@SupressWarnings({“”}),在大括號中可以寫入希望抑制的警告信息類型的數組
-
@SuppressWarnings 常用參數列表(JDK 8)
參數名 用途 all
抑制所有類型的警告(最寬泛的用法)。 unchecked
抑制 “未檢查的類型轉換” 警告(如泛型擦除導致的警告)。 deprecation
抑制 “使用已過時的類或方法” 警告。 rawtypes
抑制 “使用原始類型(raw type)” 警告(如 List
而非List<String>
)。unused
抑制 “未使用的變量 / 方法 / 類” 警告。 null
抑制 “可能的空指針引用” 警告。 serial
抑制 “實現 Serializable 接口但未定義 serialVersionUID” 警告。 finally
抑制 “finally 塊無法正常完成” 警告(如 finally
中存在return
)。fallthrough
抑制 “switch 語句缺少 break” 警告(允許 case 穿透)。 path
抑制 “類路徑或源路徑中的不存在的路徑” 警告。 boxing
抑制 “裝箱 / 拆箱操作” 警告(如 int
與Integer
之間的自動轉換)。cast
抑制 “不必要的類型轉換” 警告(如 (String) obj
但 obj 已確定為 String)。synthetic-access
抑制 “內部類的實體訪問” 警告(如內部類訪問外部類的 private 成員)。 nls
抑制 “非國際化字符串文字” 警告(如直接使用硬編碼的字符串)。 restriction
抑制 “使用不建議或禁止的引用” 警告(如使用已被 @Deprecated 標記的 API)。 -
@SuppressWarnings寫在哪個元素上,那么它的作用范圍就是這個元素,比如寫在類上就作用于整個類,寫在方法上就作用于整個方法,寫在語句上就只作用于這個語句。
-
@SupressWarning的源碼
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings {String[] value(); }
-
-元注解
-
元注解基本介紹
JDK的元用于修飾其他注解
元注解:在平時開發業務需求時很少用到,但是在開發框架時非常重要
-
元注解的種類(使用不多,了解,不用深入研究)
- Retention //指定注解的作用范圍,三種:SOURCE、CLASS、RUNTIME
- Target //指定注解可以在哪些地方使用
- Documented//指定該注解是否會在javadoc中體現
- Inherited//子類會繼承父類注解
-
@Retention注解
-
說明
只能用于修飾一個Annotation定義,用于指定該Annotation可以保留多長時間。@Retention包含一個RetentionPolicy類型的成員變量,使用@Retention時必須為該value成員變量指定值
-
@Retention的三種值
- RetentionPolicy.SOURCE:編譯器使用后,直接丟棄這種策略的注釋
- RetentionPolicy.CLASS:編譯器將把注釋記錄在class文件中。當運行Java程序時,JVM不會保留注解,這是默認值。
- RetentionPolicy.RUNTIME:編譯器將把注釋記錄在class文件中,當運行Java程序時,JVM會保留注釋,程序可以通過反射獲取該注釋
-
-
@Target注解
-
說明
用于修飾Annotation定義,用于指定被修飾的Annotation能用于修飾哪些程序元素。@Target也包含一個名為value的成員變量
-
-
@Documented注解
-
說明
用于指定被該元Annotation修飾的Annotation類將被javadoc工具提取為文檔,即在生成文檔時,可以看到該注解。定義為Documented的注解必須設置Retention值為RUNTIME。
-
-
@Inherited注解
被它修飾的Annotation將具有繼承性,如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該注釋