Kotlin的房产和开放房产有什么区别?下面的代码抱怨我声明了setter private 和Intellij说私有设置器不允许用于打开属性。什么是开放财产?
@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并不会产生影响。
答案 0 :(得分:4)
什么是开放财产?
打开属性,表示 getter / setter(?)不是最终。另一方面,它的 getter & setter 可以通过其子类覆盖。
在kotlin中,除了interface,annotation class,sealed class,enum class,variables之外,所有内容均使用最终关键字进行声明,可变属性backing field和parameters,但不可变variables& parameters为effectivily-final。
由于allopen
插件会使所有属性和&弹簧组件中的方法打开。
但是,打开属性无法生成私有设置器,如果属性已打开,例如:
//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