【问题标题】: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 插件,并将类显式标记为打开并没有什么区别。

【问题讨论】:

标签: spring properties kotlin kotlin-allopen


【解决方案1】:

什么是开放式财产?

open 属性意味着它的 getter/setter(?) 不是final。另一方面,它的 gettersetter 可以被其子类覆盖

在 kotlin 中,除了 interfaceannotation classsealed classenum classvariables、可变属性 backing fieldparameters 之外,所有内容都使用 final 关键字声明,但是不可变的variables & parameterseffectivily-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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多