快学Scala(15)--注解

Posted on 2017-04-07 11:11  paulingzhou  阅读(231)  评论(0编辑  收藏  举报

什么是注解

注解是那些你插入到代码中以便有工具可以对它们进行处理的标签。工具可以在代码级别处理,也可以处理被编译器加入了注解信息的类文件。

什么可以被注解

类、方法、字段、局部变量和参数

针对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取消与型变相关的错误提示