已移除: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