跟连乐一起学Scala-注解

欢迎加入Scala讨论QQ群212859367,和连乐一起讨论学习!

注解

什么是注解

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

@Test(timeout = 100) def testSomeFeature() { ... }

@Entity class Credentials {
    @Id @BeanProperty var username: String = _
    @BeanProperty var password: String = _
}

什么可以被注解

  1. 在Scala中,你可以为类,方法,字段,局部变量和参数添加注解。

  2. 你也可以同时添加多个注解。先后顺序没有影响。

@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,和连乐一起讨论学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值