- 注解是添加到程序源代碼中的結構化信息告材,可以出現(xiàn)在變量,方法步鉴,表達式或者其他元素上揪胃,和注釋不同,注解是由結構的氛琢,更易于被機器處理喊递。
注解的存在意義
- 編寫程序在編譯和運行之外還有別的方面,比如說可以生成說明文檔阳似,代碼具有規(guī)范的格式骚勘,或者檢查在不同的控制路徑上,文件打開而忘記了關閉障般。這些工具成為元編程工具调鲸,因為其輸入的參數(shù)為其他程序。程序員可以通過注解在源代碼中以添加指令的方式來支持這些工具挽荡。在沒有用戶輸入的情況下藐石,注解就更方便,比如可以在生成文檔的時候告知哪些方法是過時的定拟,代碼格式化的時候可以跳過手動格式化的部分等于微。
-
Scala
支持元編程工具的方法是使用注解系統(tǒng)逗嫡,編譯器理解注解,但并不對每個注解附加任何含義株依,這個每個元編程工具有可以定義它們自己特定的注解驱证。
注解的語法
-
@deprecated
,對整個方法有效恋腕。注解可以被用在任何地方抹锄,包括val,var荠藤,def伙单,class,object哈肖,trait
和type
等吻育,注解對于跟在其后的整個聲明或者定義是有效的。 - 注解也可以運用在表達式中淤井,比如在模式匹配中使用
(x: @unchecked)
布疼,注解還有更豐富的形式,@annot(expr1, expr2, expr3)
币狠,annot
是注解類名游两,剩余的是入?yún)ⅰR话阍试S為注解提供的參數(shù)都是常量总寻,但只要能夠通過編譯器檢查類型即可器罐。 -
Scala
內(nèi)部將注解表示為僅僅是對某個注解類的構造方法的調(diào)用。Scala編譯器支持注解的帶名參數(shù)和默認參數(shù)渐行。如果注解的入?yún)⑹莿e的注解轰坊,只能使用new
,而不能使用@
祟印,因為注解并不是合法的表達式肴沫。 - 一個類繼承了
scala
的Annotation
類,就是一個注解了蕴忆〔遥可以使用@
來進行標注。
標準注解
-
Scala
中包括了若干注解套鹅,是為一些非常常用的功能服務的站蝠,因此被放在了語言規(guī)范中,但是還是沒有自己的語法卓鹿。
@deprecation
- 過時可以使得使用了你的舊版本的別人的代碼仍舊可以通過編譯菱魔,再有人調(diào)用這個方法就會得到一個過時警告,可以接收一個
String
參數(shù)吟孙,用于解釋過時的原因澜倦。
@volatile
- 告訴編譯器聚蝶,這個變量會被多個線程使用,這樣的變量實現(xiàn)的效果使得讀寫更慢藻治,但是從多個線程訪問時的行為更為可期碘勉。
- 在
Java
平臺上,使用的效果和使用volatile
關鍵字是一樣的桩卵。
二進制序列化
- 序列化將對象轉換為字節(jié)流验靡,反序列化將字節(jié)流轉換為對象,在將對象保存到磁盤或者通過網(wǎng)絡發(fā)送的應用場景下非常有用吸占,
Scala
沒有自己的序列化框架晴叨,使用的是底層平臺提供的框架。-
@serializable
表示某個類是否可被序列化矾屯,一般情況下,大多數(shù)類都是可序列化的初厚,但是比如說套接字或者GUI
的窗體是不可被序列化的件蚕、
-
-
@SerialVersionUID(1234)
可以處理隨著時間推移發(fā)生變化的可序列化的類〔蹋可以添加這樣一個注解來對某個類的當前版本帶上序列號排作,序列化框架會將這個序列號保存在生成的字節(jié)流中,從字節(jié)流中恢復對象的時候亚情,可以檢查兩者的序列號是否相同妄痪。
-
-
@transient
注解用來標注不能被序列化的字段,當對象被重新載入的時候楞件,該字段會被恢復成對應類型的默認值衫生。
-
自動的get和set方法
- 通常不需要顯示給出
get
和set
方法,不過特定平臺的框架會期望set
和get
方法土浸,因此可以使用@scala.reflect.BeanProperty
注解罪针,編譯器會為該字段自動生成get
和set
方法,但是只有編譯完成這兩個方法才能被使用黄伊。被添加的字段為crazy泪酱,get生成的方法為getCrazy
,set
成成的方法為setCrazy
还最。- @尾遞歸
為了確保Scala
編譯器對該方法執(zhí)行尾遞歸墓阀,在方法定義之前添加@tailrec
注解。
- @尾遞歸
- @不檢查
使用unchecked
告訴編譯器忽略模式匹配中case
的不完整情況拓轻。
- @不檢查
- @native
告訴編譯器某個方法的實現(xiàn)是由運行時而不是Scala
代碼提供的斯撮,
- @native