在 GitHub 上編輯此頁面

已移除:private[this] 和 protected[this]

private[this]protected[this] 存取修飾詞已棄用,且將會逐步淘汰。

先前,這些修飾詞是必要的,用於

  • 避免產生 getter 和 setter
  • 排除 private[this] 下的程式碼,以避免變異檢查。(Scala 2 也會排除 protected[this],但這被發現不健全,因此已移除)。
  • 避免產生欄位,如果 private[this] val 未由類別方法存取。

編譯器現在會推論 private 成員,表示它們僅透過 this 存取。此類成員會被視為已宣告為 private[this]protected[this] 已移除,沒有替代方案。

在某些情況下,此變更會變更 Scala 程式語法的語意,因為 private val 不再保證會產生欄位。如果符合以下條件,則會省略欄位

  • val 僅透過 this 存取,且
  • val 未由目前類別中的方法存取。

如果程式嘗試透過反射存取遺失的私有欄位,這可能會造成問題。建議的修正方式是宣告欄位,改為使用封裝類別作為限定詞的限定私有。範例

class C(x: Int):
    private[C] val field = x + 1
      // [C] needed if `field` is to be accessed through reflection
    val retained = field * field