Scala RedBlackTree语法

Ale*_*rlo 6 scala scala-collections scala-2.10

我正在查看RedBlackTree文件的来源,我偶然发现了Tree我在这里复制的相关部分的定义:

sealed abstract class Tree[A, +B](
@(inline @getter) final val key: A,
@(inline @getter) final val value: B,
@(inline @getter) final val left: Tree[A, B],
@(inline @getter) final val right: Tree[A, B])
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 怎么@(inline @getter)比较@inline @getter
  2. 为什么vals合格final?(final在这种情况下不是多余的吗?)

Eri*_*aal 8

@(inline @getter)语法是一种元注释,它告诉该编译器的一个例子@inline的注释应被放置在所产生的吸气剂的方法(而不是在建筑工参数,这将在这里缺省值):元注解

final生成的字段和getter标记为final,因此子类不能覆盖它们.

此处使用此特定组合来欺骗Scala编译器直接访问Tree实例字段,而不是调用getter并依赖JVM优化器来执行正确的内联.不幸的是,Scala没有提供官方支持的直接使用字段的方法.

当针对Scala 2.10优化redblack树时,这提供了最佳性能.请参阅不可变的TreeMap/TreeSet 拉取请求以获取血腥细节.