什么是开放式财产?为什么我不能将其设置为私有?

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。另一方面,它的 gettersetter 可以被其子类覆盖

在 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

以上是关于什么是开放式财产?为什么我不能将其设置为私有?的主要内容,如果未能解决你的问题,请参考以下文章

你开放的API接口真的安全吗

什么是 .Net 的开放式 Web 界面?

如何设置个人计算机端口开放

类的访问权限

面向对象 作用域

防火墙怎么开放端口