Chapter 27《Annotations》

  • 注解是添加到程序源代码中的结构化信息,可以出现在变量,方法,表达式或者其他元素上,和注释不同,注解是由结构的,更易于被机器处理。

注解的存在意义

  • 编写程序在编译和运行之外还有别的方面,比如说可以生成说明文档,代码具有规范的格式,或者检查在不同的控制路径上,文件打开而忘记了关闭。这些工具成为元编程工具,因为其输入的参数为其他程序。程序员可以通过注解在源代码中以添加指令的方式来支持这些工具。在没有用户输入的情况下,注解就更方便,比如可以在生成文档的时候告知哪些方法是过时的,代码格式化的时候可以跳过手动格式化的部分等。
  • Scala支持元编程工具的方法是使用注解系统,编译器理解注解,但并不对每个注解附加任何含义,这个每个元编程工具有可以定义它们自己特定的注解。

注解的语法

  • @deprecated,对整个方法有效。注解可以被用在任何地方,包括val,var,def,class,object,traittype等,注解对于跟在其后的整个声明或者定义是有效的。
  • 注解也可以运用在表达式中,比如在模式匹配中使用(x: @unchecked),注解还有更丰富的形式,@annot(expr1, expr2, expr3)annot是注解类名,剩余的是入参。一般允许为注解提供的参数都是常量,但只要能够通过编译器检查类型即可。
  • Scala内部将注解表示为仅仅是对某个注解类的构造方法的调用。Scala编译器支持注解的带名参数和默认参数。如果注解的入参是别的注解,只能使用new,而不能使用@,因为注解并不是合法的表达式。
  • 一个类继承了scalaAnnotation类,就是一个注解了。可以使用@来进行标注。

标准注解

  • Scala中包括了若干注解,是为一些非常常用的功能服务的,因此被放在了语言规范中,但是还是没有自己的语法。
@deprecation
  • 过时可以使得使用了你的旧版本的别人的代码仍旧可以通过编译,再有人调用这个方法就会得到一个过时警告,可以接收一个String参数,用于解释过时的原因。
@volatile
  • 告诉编译器,这个变量会被多个线程使用,这样的变量实现的效果使得读写更慢,但是从多个线程访问时的行为更为可期。
  • Java平台上,使用的效果和使用volatile关键字是一样的。
二进制序列化
  • 序列化将对象转换为字节流,反序列化将字节流转换为对象,在将对象保存到磁盘或者通过网络发送的应用场景下非常有用,Scala没有自己的序列化框架,使用的是底层平台提供的框架。
      1. @serializable表示某个类是否可被序列化,一般情况下,大多数类都是可序列化的,但是比如说套接字或者GUI的窗体是不可被序列化的、
      1. @SerialVersionUID(1234)可以处理随着时间推移发生变化的可序列化的类。可以添加这样一个注解来对某个类的当前版本带上序列号,序列化框架会将这个序列号保存在生成的字节流中,从字节流中恢复对象的时候,可以检查两者的序列号是否相同。
      1. @transient注解用来标注不能被序列化的字段,当对象被重新载入的时候,该字段会被恢复成对应类型的默认值。
自动的get和set方法
  • 通常不需要显示给出getset方法,不过特定平台的框架会期望setget方法,因此可以使用@scala.reflect.BeanProperty注解,编译器会为该字段自动生成getset方法,但是只有编译完成这两个方法才能被使用。被添加的字段为crazy,get生成的方法为getCrazyset成成的方法为setCrazy
      1. @尾递归
        为了确保Scala编译器对该方法执行尾递归,在方法定义之前添加@tailrec注解。
      1. @不检查
        使用unchecked告诉编译器忽略模式匹配中case的不完整情况。
      1. @native
        告诉编译器某个方法的实现是由运行时而不是Scala代码提供的,

你可能感兴趣的:(Chapter 27《Annotations》)