Java8中的類型注解淺析。本站提示廣大學習愛好者:(Java8中的類型注解淺析)文章只能為提供參考,不一定能成為您想要的結果。以下是Java8中的類型注解淺析正文
注解年夜家都曉得,從java5開端參加這一特征,成長到如今已然是遍地開花,在許多框架中獲得了普遍的應用,用來簡化法式中的設置裝備擺設。那充斥爭議的類型注解畢竟是甚麼?龐雜照樣便捷?
1、甚麼是類型注解
在java 8之前,注解只能是在聲明的處所所應用,好比類,辦法,屬性;java 8外面,注解可以運用在任何處所,好比:
創立類實例
new @Interned MyObject();
類型映照
myString = (@NonNull String) str;
implements 語句中
class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }
throw exception聲明
void monitorTemperature() throws @Critical TemperatureException { ... }
須要留意的是,類型注解只是語法而不是語義,其實不會影響java的編譯時光,加載時光,和運轉時光,也就是說,編譯成class文件的時刻其實不包括類型注解。
2、類型注解的感化
先看看上面代碼:
Collections.emptyList().add("One");
int i=Integer.parseInt("hello");
System.console().readLine();
下面的代碼編譯是經由過程的,但運轉是會分離報UnsupportedOperationException; NumberFormatException;NullPointerException異常,這些都是runtime error;
類型注解被用來支撐在Java的法式中做強類型檢討。合營插件式的check framework,可以在編譯的時刻檢測出runtime error,以進步代碼質量。這就是類型注解的感化了。
3、check framework
check framework是第三方對象,合營Java的類型注解後果就是1+1>2。它可以嵌入到javac編譯器外面,可以合營ant和maven應用,也能夠作為eclipse插件。地址是http://types.cs.washington.edu/checker-framework/。
check framework可以找到類型注解湧現的處所並檢討,舉個簡略的例子:
import checkers.nullness.quals.*;
public class GetStarted {
void sample() {
@NonNull Object ref = new Object();
}
}
應用javac編譯下面的類
javac -processor checkers.nullness.NullnessChecker GetStarted.java
編譯是經由過程,但假如修正成:
@NonNull Object ref = null;
假如你不想應用類型注解檢測出來毛病,則不須要processor,直接javac GetStarted.java是可以編譯經由過程的,這是在java 8 with Type Annotation Support版本外面可以,但java 5,6,7版本都不可,由於javac編譯器不曉得@NonNull是甚麼器械,但check framework 有個向下兼容的處理計劃,就是將類型注解nonnull用/**/正文起來
,好比下面例子修正為:
import checkers.nullness.quals.*;
public class GetStarted {
void sample() {
/*@NonNull*/ Object ref = null;
}
}
如許javac編譯器就會疏忽失落正文塊,但用check framework外面的javac編譯器異樣可以或許檢測出nonnull毛病。
經由過程類型注解+check framework我們可以看到,如今runtime error可以在編譯時刻就可以找到。
4、關於JSR 308
JSR 308想要處理在Java 1.5注解中湧現的兩個成績:
1.在句法上對注解的限制:只能把注解寫在聲明的處所
2.類型體系在語義上的限制:類型體系還做不到預防一切的bug
JSR 308 經由過程以下辦法處理上述兩個成績:
1.對Java說話的句法停止擴大,許可注解湧現在更多的地位上。包含:辦法吸收器(method receivers,譯注:例public int size() @Readonly { ... }),泛型參數,數組,類型轉換,類型測試,對象創立,類型參數綁定,類繼續和throws子句。其實就是類型注解,如今是java 8的一個特征
2.經由過程引入可插拔的類型體系(pluggable type systems)可以或許創立功效更壯大的注解處置器。類型檢討器對帶有類型限制注解的源碼停止剖析,一旦發明不婚配等毛病的地方就會發生正告信息。其實就是check framework
對JSR308,有人否決,認為更龐雜更靜態了,好比
@NotEmpty List<@NonNull String> strings = new ArrayList<@NonNull String>()>
換成靜態說話為
var strings = ["one", "two"];
有人贊同,說究竟,代碼才是“最基本”的文檔。代碼中包括的注解清晰注解了代碼編寫者的意圖。當沒有實時更新或許有漏掉的時刻,恰好是注解中包括的意圖信息,最輕易在其他文檔中被喪失。並且將運轉時的毛病轉到編譯階段,不只可以加快開辟過程,還可以節儉測試時檢討bug的時光。
5、總結
其實不是人人都愛好這個特征,特殊是靜態說話比擬風行的明天,所幸,java 8其實不強求年夜家應用這個特征,否決的人可以不應用這一特征,而對代碼質量有些請求比擬高的人或公司可以采取JSR 308,究竟代碼才是“最根本”的文檔,這句話我是贊成的。固然代碼會增多,但可使你的代碼更具有表達意義。對這個特征有何意見,年夜家暢所欲言。。