欢迎加入Scala讨论QQ群212859367,和连乐一起讨论学习!
注解
什么是注解
注解是那些你插入到代码中以便有工具可以对它们进行处理的标签。
工具可以在代码级别运作,也可以处理被编译器加入了注解信息的类文件。
@Test(timeout = 100) def testSomeFeature() { ... }
@Entity class Credentials {
@Id @BeanProperty var username: String = _
@BeanProperty var password: String = _
}
什么可以被注解
-
在Scala中,你可以为类,方法,字段,局部变量和参数添加注解。
-
你也可以同时添加多个注解。先后顺序没有影响。
@BeanProperty @Id var username = _
3.
在给主构造器添加注解时,你需要将注解放置在构造器之前,并加上一对圆括号(如果注解不带参数的话)
class Credentials @Inject() (var username: String, var passwd: String)
4.
你可以为表达式添加注解:
(myMap.get(key): @unchecked) match { ... }
5.
你可以为类型参数添加注解:
class MyContainer[@specialized T]
注解参数
@Test(timeout = 100, expected = classof[IOException])
如果参数名为value,则该名称可以直接略去:
@Named("creds") var credentials: Credentials = _
如果注解不带参数,则圆括号可以略去:
@Entity class Credentials
注解实现
注解必须扩展Annotation特质。
class unchecked extends annotation.Annotation
通常而言,注解作用是描述那些被注解的表达式,变量,字段,方法,类或类型。
针对Java特性的注解
1、Java修饰符
//@volatile注解将该字段标记为易失的。
@volatile var done = false
//@transient注解将字段标记为瞬态的
@transient var recentLookups = new HashMap[String, String]
//@strictfp注解对应Java中的strictfp修饰符
@strictfp def calculate(x: Double) = ...
//@native注解用来标记那些在C或C++中实现的方法
@native def win32RegKeys(root: Int, path: String): Array[String]
2.标记接口
Scala用注解@clonealbe和@remote来标记可被克隆的和远程对象
@cloneable class Employee
对应可被序列化的类,可以使用@SerialVersionUID指定版本号
@SerialVersionUID(435435435445435454543L)
class Employee extends Person with Serializable
3.受检异常
class Book{
@throws(classOf[IOException]) def read(fileName: String) { ... }
...
}
4.变长参数
使用@varargs注解让你可以从Java调用Scala的带有变长参数的方法。
@Vera如果是得分process(args: String*)
5.JavaBean
如果你给字段加上@scala.reflect.BeanProperty注解,编译器将生成JavaBean风格的getter和setter方法。
class Person{
@BeanProperty var name: String = _
}
用于优化的注解
//1.尾递归@tailrec
//2.跳转生成与内联@switch,@inline,@noline
//3.可省略方法@elidable
//4.基本类型的特殊化@specialized
用于错误和警告的注解
如果你给某个特性加上@deprecated注解,则每当编译器遇到对这个特性的使用时,都会生成一个警告信息。
@deprecated(message = "Use factorial(n: BigInt) insteda")
def factorial(n: Int): Int = ...
@deprecatedName可以被应用到参数上,并给出一个该参数之前使用过的名称。
def draw(@deprecatedName('sz) size: Int, style: Int = NORMAL)
你仍然可以调用draw(sz=12),不过你将会得到一个表示该名称已经过时的警告。
@implicitNotFound注解用在某个隐式参数不存在的时候生成有意义的错误提示。
@unchecked注解用于在匹配不完整时取消警告消息。
@uncheckedVariance注解会取消与型变相关的错误提示。
欢迎加入Scala讨论QQ群212859367,和连乐一起讨论学习!