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

2 つの質問があります。

  1. @(inline @getter)と比べてどう@inline @getterですか?
  2. valが修飾されているのはなぜfinalですか? (finalこの文脈では冗長ではありませんか?)
4

1 に答える 1

8

@(inline @getter)構文はメタアノテーションの例であり、アノテーションは生成されたgetterメソッドに配置する必要があることをコンパイラーに通知@inlineします(ここではデフォルトとなるコンストラクターパラメーターとは対照的です):メタアノテーション

生成されたfinalフィールドとゲッターをfinalとしてマークするため、サブクラスでオーバーライドすることはできません。

Treeこの特定の組み合わせは、ゲッターを呼び出してJVMオプティマイザーに依存して適切なインライン化を実行する代わりに、Scalaコンパイラーをだましてインスタンスのフィールドに直接アクセスさせるために使用されました。残念ながら、Scalaはフィールドを直接使用するための公式にサポートされた方法を提供していません。

赤黒木がScala2.10用に最適化されたとき、これは最高のパフォーマンスをもたらしました。厄介な詳細については、不変のTreeMap/TreeSetプルリクエストを参照してください。

于 2013-01-14T08:25:31.880 に答える