当前位置: 首页 > 知识库问答 >
问题:

在kotlin中,如何将主构造函数中属性的setter设置为私有?

笪俊迈
2023-03-14

在kotlin中,如何将主构造函数中属性的setter设置为私有?

class City(val id: String, var name: String, var description: String = "") {

    fun update(name: String, description: String? = "") {
        this.name = name
        this.description = description ?: this.description
    }
}

我希望属性<code>name</code>的setter是私有的,而getter是公共的,我该怎么做?

共有2个答案

孙化
2023-03-14

你可以这样试试

class Sample(var id: Int, private var name:String) {

    // Backing field
    var _name: String = ""
        get() = name
        private set

}

fun main(args: Array<String>) {
     println("Hello World")

     val sample = Sample(1, "hello")
    //    println(sample.name); It's not possible
    println(sample._name)
}
顾炎彬
2023-03-14

解决方案是在构造函数之外创建一个属性,并设置setter的可见性。

class Sample(var id: Int, name: String) {

    var name: String = name
        private set

}

更新:
他们在这里讨论:https://discuss.kotlinlang.org/t/private-setter-for-var-in-primary-constructor/3640

 类似资料:
  • 我正在构建一个API并使用swagger测试endpoint。我有一个产品: 在这个DTO中,我想使用在我的代码中使用的Price类。价格类如下所示: 但是由于私有设置器在类中使用,我无法使用swagger设置这些值(它在这些上具有属性)。我真的很喜欢这种拥有私有设置器并使用构造函数设置值的方法,顺便说一句,这是公共的。有没有办法我可以使用swagger为类设置值,并且仍然在属性上使用私有设置器?

  • 我创建了这个扩展方法,它从一个KClass获取所有属性 扩展方法 示例用法 结果 val公司。演示。富。酒吧:科特林。内景 val公司。演示。富。巴兹:科特林。一串 VARcom.demo.Foo.boo:kotlin。字符串? 如何修改此扩展方法以仅返回在主构造函数中声明的属性? 预期成果 val公司。演示。富。酒吧:科特林。内景

  • 我们正在构建一个与远程API通信的webapp。我想这样设计这个远程API的客户端: 关键是,我想在构建期间将凭据传递给这个客户端,并让所有其他方法使用这些凭据。我的第二个要求是我希望这个实例在会话中。 我在这里发现了如何传递动态构造函数参数。 我在这里发现了如何创建会话属性。 但我想不出一种方法来结合这两种技术。据我所知,您必须在自己的类getter方法中实例化会话属性。这种类似getter的方

  • 从Kotlin开始,想要创建一个数据类

  • 我不太清楚kotlin是如何管理属性名和主构造函数参数名的。如果我写了相同的属性名和参数名,那么kotlin编译器会给出一个错误。 它给出了这个错误。 但是,当我更改属性的名称或更改主构造函数的参数名称时,代码将工作并编译。 这将工作或编译罚款。 这背后的原因是什么?为什么主构造函数的参数名和属性名不能相同?

  • 我想做一个简单的POJO(POKO?)在Kotlin中使用一个默认的空构造函数和一个带有参数的辅助构造函数创建一个类,该类提供属性 这并没有给我和属性: 这为我提供了属性,但它们在实例化后没有设置: 这给了我一个编译错误,说“不允许在二级构造函数参数上使用'var'”: 那么,这是怎么做到的?我如何拥有一个默认构造函数和一个带有参数和属性的二级构造函数?