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

wst*_*wst 6 immutability kotlin

最近IntelliJ建议添加final到其中一个val属性.此特定属性已在init {}块中初始化.我试图找出final val构造的语义是什么,何时应该使用它,但Kotlin是关于不变性的,如何在Java中val等效,final因此结果如此嘈杂,我找不到任何东西.

例:

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

init { id = 1 }
Run Code Online (Sandbox Code Playgroud)

类似财产的含义和可能用途是什么?通过应用final它所暗示的超越不可变性的限制,这是已知的?它与继承或外部访问有什么关系吗?

final如果财产是,IntelliJ停止了sugessting private.

zsm*_*b13 12

这个例子不应该建议添加,final因为它在这种情况下什么都不做.final在Kotlin 中添加有意义的唯一地方就是覆盖成员.通过添加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
}
Run Code Online (Sandbox Code Playgroud)

final如果符合以下条件,关键字不适用:

  • 你所在的班级不是open,
  • 该属性不是open,
  • 该物业是private.