`val` 属性 和 `final` 修饰符的目的是什么?

What's the purpose of `val` property with `final` modifier?

最近 IntelliJ 建议将 final 添加到 val 属性之一。这个特定的 属性 是在 init {} 块中初始化的。我试图找出 final val 构造的语义是什么以及我应该何时使用它,但 Kotlin 完全是关于不变性以及 val 如何等同于 [=29 中的 final =] 所以结果太吵了,我找不到任何东西。

示例:

final val id: Int // `final` suggested by IDE

init { id = 1 }

类似属性的含义和可能用法是什么?通过应用 final 它意味着什么限制超出了已知的不变性?它与继承或外部访问有什么关系吗?

如果 属性 是 private,IntelliJ 停止建议 final

这个例子不应该建议添加 final 因为它在这种情况下什么都不做。在 Kotlin 中添加 final 唯一有意义的地方是 overriding members。通过将 final 添加到覆盖的 属性 (或方法),您可以防止子 class 进一步覆盖它。

例如:

open class A {
    open val x: Int = 0
}

open class B : A() {
    final override val x: Int = 25
}

class C : B() {
    override val x: Int = 56 // Error: `x` in `B` is final and cannot be overridden
}

final 关键字在以下情况下并不适用:

  • 你所在的 class 不是 open,
  • 属性 不是 open,
  • 属性 是 private