【问题标题】:What's the purpose of `val` property with `final` modifier?带有`final`修饰符的`val`属性的目的是什么?
【发布时间】:2018-10-25 14:21:21
【问题描述】:

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

例子:

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

init { id = 1 }

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

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

【问题讨论】:

  • 当认为val 等同于Java final 时要小心。 val 可以使用自定义 getter 实现并返回它想要的任何内容。 class X { var mutable = 1; val immutableOrSoItSeems get() = mutable }

标签: kotlin immutability


【解决方案1】:

这个例子不应该建议添加final,因为在这种情况下它什么都不做。在 Kotlin 中添加 final 的唯一地方是 overriding members。通过将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

【讨论】:

  • 我一直很困惑,因为它是带有 Gradle 的 Kotlin-Spring 插件的 Springboot 应用程序。它所做的是,它隐式地为您打开 bean 类。所以这个类看起来是封闭的,但实际上是开放的。现在它更有意义了。谢谢你。 :)
猜你喜欢
  • 2014-09-14
  • 1970-01-01
  • 2013-05-19
  • 2011-11-11
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多