scala @switch注释,它对生成的字节代码有什么影响吗?

时间:2014-06-01 22:39:47

标签: scala annotations match

从scala docs,我理解@switch注释是告诉编译器验证匹配表达式是否已编译为tableswitch或lookupswitch,如果它编译成一系列条件表达式,则会发出错误。

现在我的问题是,如果编译成功,那么与没有使用@switch注释相比,它对生成的字节代码有什么不同吗?

请考虑以下两个示例代码版本,

版本1

  import scala.annotation.switch

  val x = 5

  (x: @switch) match {
    case 1 => println("1")
    case 2 => println("2")
    case _ => println("something else")
  }

版本2

  val x = 5

  (x) match {
    case 1 => println("1")
    case 2 => println("2")
    case _ => println("something else")
  }

是不是两个版本都会在编译时产生相同的字节码指令?

2 个答案:

答案 0 :(得分:2)

两个版本都会产生相同的字节码。您可以通过将一个版本粘贴到REPL中来执行此操作,执行:javap -以反汇编它,然后重复另一个版本。

答案 1 :(得分:1)

@switch具有更好的性能,你的模式匹配很简单,因为它使用映射表而不是决策树。由于内部结构是表格,所以它可以直接进入正确的情况" case"。有关详情,请访问http://alvinalexander.com/scala/using-match-expression-like-switch-statement