什么是注解
注解是那些你插入到代码中以便有工具可以对它们进行处理的标签。工具可以在代码级别处理,也可以处理被编译器加入了注解信息的类文件。
什么可以被注解
类、方法、字段、局部变量和参数
针对Java特性的注解
1. Java修饰符
@volatile => volatile
@transient => transient //瞬态,不会被序列化
@strictfp => strictfp //使用IEEE的double值来进行浮点运算。计算结果更慢,但代码可移植性更高
@native => native //标记那些在C或C++代码中实现的方法
2. 标记接口
@cloneable => Cloneable @remote => java.rmi.Remote
3. 受检异常
class Book { @throws(classOf[IOException]) def read(filename: String) { ... } // void read(String filename) throws IOException }
4. 变长参数
@varargs def process(args: String*)
5. JavaBeans
@BeanProperty,编译器将生成JavaBeans风格的getter和setter方法。
用于优化的注解
1. 尾递归:@tailrec
2. 跳转表生成与内联:@switch
(n: @switch) match { case 0 => "Zero"
case 1 => "One"
case _ => "?"
}
3. 可省略方法:@elidable
4. 基本类型的特殊化
def allDifferent[T](x: T, y: T, z: T) = ... //不高效,装箱拆箱
def allDifferent(x: Int, y: Int, z: Int) //优化,但要写七个方法
def allDifferent[@specialized T](x: T, y: T, z: T) //编译器自动生成七个方法
def allDifferent[@specialized(Long, Double) T](x: T, y: T, z: T) //特殊化限定在所有可选类型的子集
可指定类型: Unit, Boolean, Byte, Short, Char, Int, Long, Float, Double
用于错误和警告的注解
@deprecated
@deprecatedName
@implicitNotFound 在某个隐式参数不存在的时候生成有意义的错误提示
@unchecked 用于在匹配不完整时取消警告消息
@uncheckedVariance取消与型变相关的错误提示