6

我正在查看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])

我有两个问题:

  1. @(inline @getter)相比如何@inline @getter
  2. 为什么vals 有资格final?(在这种情况下不是final多余的吗?)
4

1 回答 1

8

语法是元注解的@(inline @getter)一个例子,它告诉编译器@inline注解应该放在生成的 getter 方法上(而不是构造函数参数,这将是这里的默认值):元注解

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

这种特殊的组合在这里被用来欺骗 Scala 编译器直接访问Tree实例的字段,而不是调用 getter 并依赖 JVM 优化器来执行正确的内联。不幸的是,Scala 没有提供官方支持的直接使用字段的方式。

当红黑树针对 Scala 2.10 进行优化时,它提供了最佳性能。有关血腥细节,请参阅不可变 TreeMap/TreeSet拉取请求

于 2013-01-14T08:25:31.880 回答