Java 枚舉和注解總結(jié)
枚舉
沒(méi)有枚舉前我們基本上常量來(lái)定義值:
public interface Color{
public static final int GREEN = 0;
public static final int RED = 1;
....
....
....
}
如果有了枚舉后我們會(huì)怎樣了?
public enum Color{
GREEN,RED,BLACk,.......
}
代碼是不是就清晰很多了?而且使用的時(shí)候輸出的值我們是可以使用GREEN,是不是可以很明白的知道是什么顏色?
枚舉的創(chuàng)建
枚舉是繼承自Enum,使用enum關(guān)鍵字。
枚舉的使用場(chǎng)景
枚舉適合在固定的常量下使用,比如四季,月份,星期;這種基本公認(rèn)的而且不會(huì)有改變的場(chǎng)景下使用。
編譯器中的枚舉
編譯器默認(rèn)幫我們實(shí)現(xiàn)了很多枚舉中的方法,比如equals(),hashCode(),toString,values(),valueOf(String)等。這些都是編譯器幫我們做的。
枚舉中的注意事項(xiàng)
- 不能使用static,final修飾枚舉,因?yàn)樗请[式的final類型的;
- 因?yàn)槭莊inal類型,所以我們也就知道它是不能被繼承的;
- 從Enum繼承的clone是final類型的,枚舉是不能重寫clone方法的,并且Enum里面的clone方法直接拋出異常,所以enum是不能被clone的;
- enum中的ordinal是強(qiáng)依賴于枚舉實(shí)例的定義順序的,所以用ordinal來(lái)做判斷順序是不推薦的,因?yàn)橹灰诜亲詈蠹尤雽?shí)例,那么就會(huì)改變整體的順序;如果是需要順序可以自定義屬性。
注解
注解出現(xiàn)前
注解的作用我理解為就是用來(lái)約定一些數(shù)據(jù)定義,讓我們可以在某個(gè)屬性或者某個(gè)地方做個(gè)標(biāo)記。在注解出現(xiàn)前能做這個(gè)的應(yīng)該是XML,我們通常在xml中定義類或者屬性的相關(guān)配置。而有了注解我們可以在代碼中直接定義了。
注解的分類
- 定義注解的注解,元注解:
@Rentation,@Target,@Document,@Inherited - jdk內(nèi)置注解:
@Override,@Deprecated... - 自定義的注解
- spring等外部注解
作用場(chǎng)景:
@Rentation:Source,Class,Runtime
作用目標(biāo)域:
@Target:Construct,F(xiàn)ield,Local_variable,method,package,paramter,type
注解的定義
注解的定義使用@interface關(guān)鍵字,并且使用元注解進(jìn)行標(biāo)注:
@Rentation(Rentation.Runtime)
@Target(ElementType.Field)
public @interface XxAnotation{
String values() default "";
}
注解屬性
注解里面的屬性只能使用以下6種類型來(lái)定義:
1. 所有的基本類型;
2. String
3. Class
4. enum
5. Annotation
6. 以上類型的數(shù)組類型
注解不允許使用基本類型的包裝類來(lái)定義里面的注解屬性。注解里面的屬性都是使用方法的方式來(lái)定義的。有點(diǎn)類似接口方法。
注解的屬性需要注意一下幾點(diǎn):
- 要么具有默認(rèn)值,要么在使用注解的時(shí)候提供屬性的值;
- 非基本類型的元素,默認(rèn)值不能為null;
- 如果只有一個(gè)屬性,那么可以設(shè)置為value,在使用注解的時(shí)候就可以直接賦值;
@XxAnotation("ok")
ps:注解是不能繼承的。
注解處理器
我們定義了注解,設(shè)置了元素值。那么就必須要有一個(gè)處理器來(lái)進(jìn)行注解處理。這個(gè)可以看看之前的Java 特殊字段脫敏,我們可以使用反射來(lái)獲取注解定義的值,然后進(jìn)行業(yè)務(wù)處理。