什么是开放属性?为什么我不能将其setter设置为私有?

13
在 Kotlin 中,属性与开放属性的区别在哪里?下面的代码因为我声明了 setter 为 private 而出错,Intellij 显示 open 属性不允许使用私有 setter。什么是开放属性?
@RestController
open class ParameterController {

  @Autowired
  lateinit var parameterRepository: ParameterRepository
    private set //error


}
为什么上面的代码无效而这段代码有效?
open class ItemPrice{

    lateinit var type: String
        private set // ok

}

编辑:我正在使用spring-allopen插件,显式将类标记为open没有任何区别。


你的代码包含了太多无用信息。尝试创建一个最小、完整、可验证的示例 - nhaarman
1个回答

18
一个开放属性是指它的getter/setter没有被final修饰。另一方面,它的getter和setter可以被其子类覆盖。
在Kotlin中,除了接口注解类密封类枚举类变量、可变属性支持字段参数外,所有内容都使用final关键字声明,但不可变的变量参数实际上是有效的final。请注意保留HTML标签。
由于allopen插件会使得所有的属性和方法在spring组件中开放
然而,如果一个属性是开放的,则无法使其具有私有的setter,例如:
//v--- allopen plugin will remove all `final` keyword, it is equivalent to `open`
open var value: String=""; private set
//                         ^--- ERROR:private set are not allowed

因此,您必须明确将属性设置为 final,例如:

//v--- makes it final explicitly by `final` keyword
final var value: String =""; private set

我正在使用Spring-openall插件,我将编辑我的问题以反映这一点。 - greyfox
确认这是正确的答案。如果我删除Spring注释,错误就会消失。变量现在被声明为lateinit final var repo:ParameterRepository private set。 - greyfox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接