什么是开放财产?为什么我不能将其二传手设为私人?

时间:2017-07-17 21:32:33

标签: spring properties kotlin kotlin-allopen

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并不会产生影响。

1 个答案:

答案 0 :(得分:4)

  

什么是开放财产?

打开属性,表示 getter / setter(?)不是最终。另一方面,它的 getter & setter 可以通过其子类覆盖

在kotlin中,除了interfaceannotation classsealed classenum classvariables之外,所有内容均使用最终关键字进行声明,可变属性backing fieldparameters,但不可变variables& parameterseffectivily-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