Scala学习笔记 A2/L1篇 - 注解 Annotation

2018-08-22  本文已影响0人  hakase_nano

教材:快学Scala

chapter 15. 注解 Annotations

15.1 什么是注解

15.2 什么可以被注解

15.5 Annotations for Java Features

15.6 Annotations for Optimizations

@tailrec 显式提示编译器尾递归优化
尾递归,如果递归计算过程的最后一步是递归调用同一个方法,编译器会自动尾递归优化
消除递归的另一种方法:蹦床机制 TailCalls
@switch 检查match语句是否编译成了跳转表(类似C++的switch语句编译效果)
@inline 方法内联 @noinline 不要做内联
@elidable 给那些可以在生成代码中移除的方法打上标记
@elidable(500) def dump(props: Map[Int, Int]) {...}
如果编译命令为 scalac -Xelide-below 800 myprog.scala 则上述dump代码不会被生成
还可以用常量值代表,如INFO=800,WARNING=1000,ASSERTION=2000
assert方法是@elidable(ASSERTION) 忽略assert的编译命令为 -Xelide-below MAXIMUM 缺省情况下不禁用assert
@specialized(Long, Double) 将泛型代码转换为特定基本类型版本的代码

15.7 Annotations for Errors and Warnings

@deprecated 遇到这个特性的使用时会产生一个warning,有messagesince参数
@deprecatedName 参数注解,用于给出一个被遗弃的参数名称

def draw(@deprecatedName('sz) size: Int, style: Int = 0) {println("drawing shape size = " + size)) // draw: (size: Int, style: Int)Unit
draw(1) // drawing shape size = 1
draw(size = 2) // drawing shape size = 2

draw(sz = 3)
// warning: there was one deprecation warning; re-run with -deprecation for details
// drawing shape size = 3

单引号(')开头的名称是一个符号(symbol) 名称相同的符号一定是唯一的
符号比字符串效率高,符号的==方法判断引用是否相同,字符串的==方法需要比对内容
符号的语义:A symbol denotes a name of some item in a program.
@implicitNotFound 某个隐式参数不存在的时候生成有意义的错误提示
@unchecked 在match语句匹配不完整时取消警告信息
@uncheckedVariance 取消与型变相关的错误提示

上一篇下一篇

猜你喜欢

热点阅读