Scala基础之注解(annotation
在学习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的更多相关文章
- Java 基础之--注解Annotation详解
自定义注解入门: public @interface Annotation01 { //set default value ""; String value() default & ...
- java基础篇---注解(Annotation)
一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...
- java 编程基础:注解(Annotation Processing Tool)注解处理器 利用注解解读类属性生成XML文件
APT的介绍: APT(Annotation Processing Tool)是一种注解处理工具,它对源代码文件进行检测,并找出源文件所包含的注解信息,然后针对注解信息进行额外的处理. 使用APT工具 ...
- scala 基础知识总结
在最开始处引入 log 相关的 包 import org.apache.log4j.{Logger,Level} 在需要屏蔽日志输出的地方加上这两行代码 // 屏蔽不必要的日志显示在终端上 Logge ...
- java基础-注解Annotation原理和用法
在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...
- Java基础加强总结(一)——注解(Annotation)
一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts ...
- java基础—注解annotation
一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts ...
- 夯实Java基础(十七)——注解(Annotation)
1.注解概述 从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation).其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 “@Overr ...
- Java基础之理解Annotation(与@有关,即是注释)
Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...
随机推荐
- 文件系统的几种类型:ext3, swap, RAID, LVM
分类: 架构设计与优化 1. ext3 在异常断电或系统崩溃(不洁关机, unclean system shutdown ).每个已挂载ext2文件系统计算机必须使用e2fsck程序来检查其一致性 ...
- Vue项目搭建基础之Vue-cli模版测试
第一步安装node,nodejs.org下载node稳定版安装包.node -v (查看node版本)npm install -g vue-cli(安装Vue脚手架环境)vuevue listvu ...
- 个人作业3-个人总结(Alpha阶段)
一.个人总结 1.团队状况:这是我们第一次团队开发,小组成员的编程水平都相对一般,要在一周内完成一个APP是一个很大的考验.再加上冲刺的那周团队大半成员都在为一个比赛培训,时间就更少了,曾经有很多次我 ...
- 团队作业4——第一次项目冲刺(Alpha版本)4.27
一.当天站立式会议照片 本次会议主要内容:组长给大家分配新一步任务,分别汇报目前所完成的内容,完善昨日的解压接口代码,并做测试修正. 二.每个人的工 三.燃尽图 横坐标:工作日,以天为单位,一共七天, ...
- Swing-JComboBox用法-入门
JComboBox是Swing中的下拉菜单控件.它永远只能选中一个项目,然而比单选按钮节省空间.如果使用setEditable设置为true则内部选项的文本可以编辑,因此这种组件被称为组合框.注意,对 ...
- Swing-JCheckBox用法-入门
JCheckBox是Swing中的复选框.所谓复选框就是指,可以同时存在多个这样的控件,它们可以有多个处于被选中状态.对于每一个复选框而言,它只有选中和未选中两种状态. JCheckBox的常用方法如 ...
- 201521123062《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 for (int i = 0; i < list.size(); ...
- JAVA课程设计猜数游戏 个人
1.团队课程设计博客链接 https://i.cnblogs.com/EditPosts.aspx?postid=7067843&update=1 2.个人负责模块说明 输入用户ID 2.主要 ...
- 201521123038 《Java程序设计》 第九周学习总结
201521123038 <Java程序设计> 第九周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 ...
- 框架应用:Spring framework (一) - IoC技术
IoC概念以及目标 IoC就是让原本你自己管理的对象交由容器来进行管理,其主要的目的是松耦合. IoC发展史 既然IoC的目标是为了松耦合,那它怎么做到的? 最后目标:降低对象之间的耦合度,IoC技术 ...