首页 > 解决方案 > Kotlin:如何通过对象访问类的私有数据成员?

问题描述

如果 p.name 是私有的,我如何通过它的对象访问它?

Getter 和 setter 在这里不起作用。

class Person(f_name : String, l_name : String){
    private var name = f_name + l_name
    get() = field
    set(value) {
        field = value
    }
    private var age : Int? = null
        get() {
            println("Age getter")
            return field
        }
        set(value) {
            println("Age setter")
            field = value
        }
    constructor(f_name: String, l_name: String, age : Int):this(f_name, l_name){
        name = "Mr./Msr./Ms. $f_name $l_name"
        this.age = age
    }

}

fun main() {
    var p = Person("M", "M")
    var m = Person("P", "P", 20)

    println("p : Person(${p.name})") // Shows error here

}

我无法以这种方式访问​​任何私人成员。这里没有使用 getter 和 setter。

标签: kotlin

解决方案


您可能希望使用不可变数据类来解决此问题。然后 setter 是不必要的,而 getter 可以是公共的:

data class Person(
    val firstName: String,
    val lastName: String,
    val age: Int? = null
)

您可以定义为扩展属性的完整名称:

val Person.name get() = "Mr./Msr./Ms. $firstName $lastName"

作为默认的私有属性是不可访问的,但如果你愿意,你可以限制 setter 的访问:

var name: String = ""
    private set

一般来说,属性是一个 getter,也可能是一个访问字段的 setter。该领域从不公开。因此,要实现您想要的,您只需要将属性声明为var name: String.


推荐阅读