模式匹配编译为 tableswitch 或 lookupswitch
@switch
注释告诉编译器 match
语句可以在字节码级别用单个 tableswitch
指令替换。这是一个次要优化,可以在运行时删除不必要的比较和变量加载。
@switch
注释仅适用于与文字常量和 final val
标识符的匹配。如果模式匹配无法编译为 tableswitch
/ lookupswitch
,编译器将发出警告。
import annotation.switch
def suffix(i: Int) = (i: @switch) match {
case 1 => "st"
case 2 => "nd"
case 3 => "rd"
case _ => "th"
}
结果与正常模式匹配相同:
scala> suffix(2)
res1: String = "2nd"
scala> suffix(4)
res2: String = "4th"
来自 Scala 文档 (2.8+) - @switch
:
要应用于匹配表达式的注释。如果存在,编译器将验证匹配是否已编译为 tableswitch 或 lookupswitch,如果它编译为一系列条件表达式,则发出错误。
从 Java 规范:
- tableswitch :通过索引和跳转访问跳转表
- lookupswitch :通过密钥匹配和跳转访问跳转表