最近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
进行提示。
答案 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
。