Scala注解详解

来源:互联网 发布:2018年淘宝卖什么好 编辑:程序博客网 时间:2024/06/06 09:33

什么是注解:
就是scala 编译器,就可以在编译的时候,注解有一些特殊的操作。
scala 中,有哪些地方可以添加注解?
scala中,可以给类,方法,fields、local variable、constructor / method / functions parameters添加注解,而且scala是支持给某个目标添加多个注解的
有一个很金典的注解@BeanProperty ,让编译器自动生成JavaBean风格的Getter和Setter方法

  • 如果给类的主构造函数添加函数
//如果给类的主构造函数添加函数,那么需要砸构造函数前添加一对圆括号class Person @unchecked() (val name:String, val age:Int)
  • 给表达式添加注解
val scores= Map("leo"-> 90,"Jack"-> 87)//给表达式添加注解,需要在表达式的后面添加冒号和注解(scores.get("leo"):@unchecked) match{case score => println(score))

  • scala中自定义注解
    要自己添加注解,就必须扩展Annotation trait,比如
class Test extends annotation.Annotation@Testclass myTest

  • 注解的参数:
class Test(var timeout :Int)extends annotation.Annotation@Test(timeout= 100) class myTest//如果注解的参数是value的话,那么可以不用指定注解的参数名,class Test(var value:String) extends annotation.Annotation

  • 常用注解介绍
    scala中的常用注解全部是针对java的一些概念
@volatile var name="jack"//轻量级的java多线程的并发控制器
  • jvm虚拟机中,可以有多个线程,每个线程都有自己的工作区,还有一些线程共享的工作区,每一个线程拿到一个公共的变量,都需要砸共享区中拷贝一个副本到自己的工作区中使用和修改,修改完成之后,再找一个合适的时机,将副本值,写回共享区中;
  • 这里就会出现一个多线程的并发访问安全的问题
  • 多个线程如果同时拷贝到了变量副本,都做了不同的修改
  • 然后一次将副本写回共享区中,都会一次覆盖掉之前的副本值,这将造成很多的变量副本的值丢失
  • @valatile修饰的变量:它可以保证,一个线程在共享区中获取一个变量的值的副本时,都会强制刷新这个变量的值,保证自己获取到的这个变量的副本值时最新的,但是这种方法也不是百分百保险的
@transient var name="leo"//瞬间字段,不会虚拟化这个字段
  • 默认会讲一个对象中的所有字段的值,都序列化到磁盘文件中去
  • 加了@transient的字段,是瞬态的,序列化的时候会忽略这个值,反序列化这个值就没有了
@SeriaVersionUID(value//标记类的序列化版本
  • 如果我们将一个类的对象序列化到磁盘上了,过了一段时间,这类的代码改变了,此时如果你想把磁盘中的对象反序列化回来,就会报错
  • 针对这个问题,就应该有一个序列化的版本号
  • 如果你的类改变了就应该重新生成一个序列化版本号
  • 反序列化的时候,就会发现序列化类型的版本号和代码中的版本号不一致
@native //标注用C实现的本地的方法
@throw(classOf[Exception] def test())// 给方法标记要抛出的checked异常
@varargs def test(args:String*){}//标注方法中的参数是变长参数
@BeanProperty//标记生成java风格的getter/setter方法
@BooleanBeanProperty//标记生生成is风格的getter方法
@deprecated(message=""//标记过时的方法,让编译器发出警告
@unchecked//让编译器发出类型转换的警告
原创粉丝点击