在学习Scala的过程中,总会碰到一些注解:

// Predef.scala
@inline def implicitly[T](implicit e: T) = e @deprecated("Use `sys.error(message)` instead", "2.9.0")
def error(message: String): Nothing = sys.error(message) // Spark RDD.scala
abstract class RDD[T: ClassTag](
@transient private var sc: SparkContext,
....)

一般来说,注解可以作用于vals, vars, defs, classes, objects, traits 和 types甚至是表达式的后面。

import scala.reflect.runtime.{ universe => ju }

def meth[A: ju.TypeTag](xs: List[A]) = xs match {
case strList: List[String @ unchecked]
if ju.typeTag[A].tpe =:= ju.typeOf[String] => "list of Strings"
case barList: List[Bar @ unchecked]
if ju.typeTag[A].tpe =:= ju.typeOf[Bar] => "list of Bar"
}

我们知道List[T]在运行时会被类型擦除,相当于变成List。@unchecked 告诉compiler不要去检查这个,否则就会报下面的warning。

non-variable type argument String in type pattern List[String] is unchecked
since it is eliminated by erasure

另外, 注解实际上也是普通的类只不过编译器对其进行特殊的支持,所以我们才能那样书写。比如说,我们常见的序列号的注解。

class SerialVersionUID(uid: Long) extends scala.annotation.StaticAnnotation

@SerialVersionUID(13567156)
class B {} @deprecated("use newShinyMethod() instead", "since 2.3")
def bigMistake() = //...
bigMistake scalac -deprecation Deprecation2.scala warning: method bigMistake in class B is deprecated: use newShinyMethod() instead
println(bigMistake)
^
one warning found

@volatile

实际上这个注解或是关键字,大多用于被并发访问的共享变量。在JVM内存模型中happens-before规则有一条就是volatile变量法则(有兴趣可以阅读Java并发编程实践 第16章Java内存模型),对于volatile变量,同一变量的写操作总是先于读操作。

class Person(@volatile var name: String) {
def set(changedName: String) {
name = changedName
}
}

@tailrec

这个注解是与尾递归优化有关的。

// 阶乘
def factorial(n: Int) = {
@tailrec def go(n: Int, acc: Int): Int = {
if (n <=0) acc
else go(n-1, acc * n)
// 尾递归,顾名思义方法的调用也必须出现在返回值的位置
}
go(n, 1)
}

@Unchecked

一般是在模式匹配的时候用到的,告诉编译器有些地方不用"检查"了。如前所述,List[String @ unchecked]。

@transient

这个注解一般用于序列化的时候,标识某个字段不用被序列化。

import java.io.{ FileOutputStream, FileInputStream }
import java.io.{ ObjectOutputStream, ObjectInputStream } class Hippie(val name: String, @transient val age: Int) extends Serializable object Serialization { val fos = new FileOutputStream("hippie.txt")
val oos = new ObjectOutputStream(fos) val p1 = new Hippie("zml", 34)
oos.writeObject(p1)
oos.close()
} object Deserialization extends App { val fis = new FileInputStream("hippie.txt")
val ois = new ObjectInputStream(fis) val hippy = ois.readObject.asInstanceOf[Hippie]
println(hippy.name)
println(hippy.age)
ois.close()
} 运行之后的结果
zml
0

由于age被标记为@transient,在反序列化的时候,就获取不到原始值了所以被赋值为默认值。

@inline

这个注解,在Scala.Predef中见到过一次。官方文档中的解释跟没说一样, 倒是StackOverflow上一个的答案,个人觉得比较能说明作用。

Instead of a function call resulting in parameters being placed on the stack and an invoke operation occurring, the definition of the function is copied at compile time to where the invocation was made, saving the invocation overhead at runtime.

大致的意思就是@inline能够避免方法的参数被放到栈上,以及"显示的调用"。因为编译器在编译的时候会将整个方法复制到它被调用的地方。

http://stackoverflow.com/questions/4593710/when-should-i-and-should-i-not-use-scalas-inline-annotation

Scala基础之注解(annotation的更多相关文章

  1. Java 基础之--注解Annotation详解

    自定义注解入门: public @interface Annotation01 { //set default value ""; String value() default & ...

  2. java基础篇---注解(Annotation)

    一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...

  3. java 编程基础:注解(Annotation Processing Tool)注解处理器 利用注解解读类属性生成XML文件

    APT的介绍: APT(Annotation Processing Tool)是一种注解处理工具,它对源代码文件进行检测,并找出源文件所包含的注解信息,然后针对注解信息进行额外的处理. 使用APT工具 ...

  4. scala 基础知识总结

    在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...

  5. java基础-注解Annotation原理和用法

    在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...

  6. Java基础加强总结(一)——注解(Annotation)

    一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts ...

  7. java基础—注解annotation

    一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts ...

  8. 夯实Java基础(十七)——注解(Annotation)

    1.注解概述 从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation).其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 “@Overr ...

  9. Java基础之理解Annotation(与@有关,即是注释)

    Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...

随机推荐

  1. 【ctrl+A】与【ctrl+单击图层缩略图】有什么区别?

    如果这图层没有透明区域的话那和ctrl+A的效果是一样的! 但如果图层有不透明区域,那选中的就是图层中所有不透明的区域!

  2. 201521123111《Java程序设计》第8周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 附上ppt: 1.2 选做:收集你认为有用的代码片段 List strList = new ArrayList ...

  3. 201521123122 Java 第二周学习总结

    1. 本周学习总结 1.进一步了解了对码云的使用,学会了将本地代码上传到码云以及将码云上的代码克隆到eclipse上. 2.感觉本章学的基本语法和c的基本上差不多啊 3.string的对象创建后无法修 ...

  4. 201521123065《java程序设计》第14周学习总结

    1. 本周学习总结 1.大部分情况下使用的数据库是关系型的数据库,使用表存储数据: 2.关系型数据库可以通过唯一的主键查找记录,也可以通过多个信息确定主键: 3.Mysql操作:显示-show dat ...

  5. 201521123045 <java程序设计>第11周学习总结

    201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...

  6. 201521123118《java程序与设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1. finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中fi ...

  7. lintcode 453 将二叉树拆成链表

    将二叉树拆成链表   描述 笔记 数据 评测 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 注意事项 不要忘记将左儿子标 ...

  8. Maven第四篇【私有仓库、上传jar包、引用私服jar包、上传本地项目到私服】

    搭建私有服务器 前面已经说过了,我们使用Maven的使用,如果需要导入相对应的jar包,Maven首先会在我们的本地仓库中寻找->私有仓库->中心仓库- 然而,我们的本地仓库常常没有想要的 ...

  9. 如何使用fiddler抓取https请求(PC和移动端)

    最近做一个抓取移动端app接口,并执行评论,收藏的接口功能测试.怎么搞/(ㄒoㄒ)/~~ 按照老思路试一试,第一步还是要用fiddler来帮忙获取接口信息! 一.基本的抓取http请求设置: 1.cm ...

  10. 短视频图像处理 OpenGL ES 实践

    2017年,短视频正以其丰富的内容表现力和时间碎片化的特点,快速崛起,而短视频最具可玩性之处就在支持人脸识别的动态贴图和各种不同效果的美颜.滤镜等.那短视频动态贴纸.滤镜.美颜等功能究竟是如何实现的呢 ...