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

时间:2018-10-25 05:54:04

标签: kotlin immutability

最近IntelliJ建议将final添加到val属性之一。此特定属性在init {}块中初始化。我试图找出final val构造的语义是什么以及何时使用它,但是Kotlin完全是关于不变性的,以及val在Java中如何等效于final等等。结果太吵了,我什么都找不到。

示例:

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

init { id = 1 }

类似财产的含义和可能用途是什么?通过应用final,除了已知的不变性之外,它还意味着什么限制?它与继承或外部访问有关系吗?

如果属性为final,IntelliJ将停止对private进行提示。

1 个答案:

答案 0 :(得分:6)

该示例本身不建议添加final,因为在这种情况下它什么也不做。在overriding members中,唯一可以在Kotlin中添加final的地方。通过将final添加到覆盖的属性(或方法),可以防止子类进一步覆盖它。

例如:

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关键字实际上并不适用

  • 您所在的班级不是open
  • 该属性不是open
  • 该属性为private