`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
。
最近 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
。