- 注解是添加到程序源代码中的结构化信息,可以出现在变量,方法,表达式或者其他元素上,和注释不同,注解是由结构的,更易于被机器处理。
注解的存在意义
- 编写程序在编译和运行之外还有别的方面,比如说可以生成说明文档,代码具有规范的格式,或者检查在不同的控制路径上,文件打开而忘记了关闭。这些工具成为元编程工具,因为其输入的参数为其他程序。程序员可以通过注解在源代码中以添加指令的方式来支持这些工具。在没有用户输入的情况下,注解就更方便,比如可以在生成文档的时候告知哪些方法是过时的,代码格式化的时候可以跳过手动格式化的部分等。
-
Scala
支持元编程工具的方法是使用注解系统,编译器理解注解,但并不对每个注解附加任何含义,这个每个元编程工具有可以定义它们自己特定的注解。
注解的语法
-
@deprecated
,对整个方法有效。注解可以被用在任何地方,包括val,var,def,class,object,trait
和type
等,注解对于跟在其后的整个声明或者定义是有效的。 - 注解也可以运用在表达式中,比如在模式匹配中使用
(x: @unchecked)
,注解还有更丰富的形式,@annot(expr1, expr2, expr3)
,annot
是注解类名,剩余的是入参。一般允许为注解提供的参数都是常量,但只要能够通过编译器检查类型即可。 -
Scala
内部将注解表示为仅仅是对某个注解类的构造方法的调用。Scala编译器支持注解的带名参数和默认参数。如果注解的入参是别的注解,只能使用new
,而不能使用@
,因为注解并不是合法的表达式。 - 一个类继承了
scala
的Annotation
类,就是一个注解了。可以使用@
来进行标注。
标准注解
-
Scala
中包括了若干注解,是为一些非常常用的功能服务的,因此被放在了语言规范中,但是还是没有自己的语法。
@deprecation
- 过时可以使得使用了你的旧版本的别人的代码仍旧可以通过编译,再有人调用这个方法就会得到一个过时警告,可以接收一个
String
参数,用于解释过时的原因。
@volatile
- 告诉编译器,这个变量会被多个线程使用,这样的变量实现的效果使得读写更慢,但是从多个线程访问时的行为更为可期。
- 在
Java
平台上,使用的效果和使用volatile
关键字是一样的。
二进制序列化
- 序列化将对象转换为字节流,反序列化将字节流转换为对象,在将对象保存到磁盘或者通过网络发送的应用场景下非常有用,
Scala
没有自己的序列化框架,使用的是底层平台提供的框架。-
@serializable
表示某个类是否可被序列化,一般情况下,大多数类都是可序列化的,但是比如说套接字或者GUI
的窗体是不可被序列化的、
-
-
@SerialVersionUID(1234)
可以处理随着时间推移发生变化的可序列化的类。可以添加这样一个注解来对某个类的当前版本带上序列号,序列化框架会将这个序列号保存在生成的字节流中,从字节流中恢复对象的时候,可以检查两者的序列号是否相同。
-
-
@transient
注解用来标注不能被序列化的字段,当对象被重新载入的时候,该字段会被恢复成对应类型的默认值。
-
自动的get和set方法
- 通常不需要显示给出
get
和set
方法,不过特定平台的框架会期望set
和get
方法,因此可以使用@scala.reflect.BeanProperty
注解,编译器会为该字段自动生成get
和set
方法,但是只有编译完成这两个方法才能被使用。被添加的字段为crazy,get生成的方法为getCrazy
,set
成成的方法为setCrazy
。- @尾递归
为了确保Scala
编译器对该方法执行尾递归,在方法定义之前添加@tailrec
注解。
- @尾递归
- @不检查
使用unchecked
告诉编译器忽略模式匹配中case
的不完整情况。
- @不检查
- @native
告诉编译器某个方法的实现是由运行时而不是Scala
代码提供的,
- @native
网友评论