2013-01-14 105 views
6

我一直在寻找在RedBlackTree文件的来源,我偶然发现了定义Tree,其中我在这里复制了相关部分:斯卡拉RedBlackTree语法

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]) 

我有2个问题:

  1. @(inline @getter)如何与@inline @getter比较?
  2. 为什么val s符合final? (是不是final在此上下文中的冗余?)

回答

8

@(inline @getter)语法是一种元注释,它告诉该@inline注释应放在所生成的吸气剂的方法(而不是在建筑工编译器的一个例子参数,这将是默认值):meta annotations

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

这里使用了这个特定的组合来欺骗Scala编译器直接访问Tree实例的字段,而不是调用getter并依靠JVM优化器来执行适当的内联。不幸的是,Scala没有提供直接使用字段的官方支持方式。

当redblack树针对Scala 2.10进行了优化时,这给出了最佳性能。有关血淋淋的细节,请参阅不可变的TreeMap/TreeSet pull request

+0

我已经阅读了一些拉请求,但是我从未注意过上面的内容,感谢您提出解释! –