什么是开放式财产?为什么我不能将其设置为私有?
Posted
技术标签:
【中文标题】什么是开放式财产?为什么我不能将其设置为私有?【英文标题】:What is an open property? Why I can't make its setter to private? 【发布时间】:2017-12-22 13:36:38 【问题描述】:Kotlin 中的属性和开放属性有什么区别?下面的代码抱怨我声明了 setter private 并且 Intellij 说 private setter 不允许用于 open 属性。什么是开放式财产?
@RestController
open class ParameterController
@Autowired
lateinit var parameterRepository: ParameterRepository
private set //error
为什么上面的代码无效,而这个代码却是?
open class ItemPrice
lateinit var type: String
private set // ok
编辑:我正在使用 spring-allopen 插件,并将类显式标记为打开并没有什么区别。
【问题讨论】:
您的代码噪音太大。尝试创建一个Minimal, Complete, and Verifiable example。 【参考方案1】:什么是开放式财产?
open 属性意味着它的 getter/setter(?) 不是final。另一方面,它的 getter 和 setter 可以被其子类覆盖。
在 kotlin 中,除了 interface、annotation class、sealed class、enum class、variables、可变属性 backing field 和 parameters 之外,所有内容都使用 final 关键字声明,但是不可变的variables & parameters 是effectivily-final。
由于allopen
插件将使spring组件中的所有属性和方法打开。
但是,open 属性不能创建 private 设置器,如果该属性open,例如:
//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 插件,我将编辑我的问题以反映这一点 确认这是正确答案。如果我删除 Spring 注释,错误就会消失。这些变量现在被声明为 lateinit final var repo: ParameterRepository private set以上是关于什么是开放式财产?为什么我不能将其设置为私有?的主要内容,如果未能解决你的问题,请参考以下文章