kotlin - 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。
解决方案
您可能希望使用不可变数据类来解决此问题。然后 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
.
推荐阅读
- email - Outlook 删除换行符 UTF-8 和纯文本邮件,无论配置如何
- python - 将两个 Numpy 数据集转换为特定的 PyTorch 数据集
- salesforce - 将应用程序与 Sage People (HRIS/HRMS) 集成
- go - 如何在 go 模板中转换给定的代码
- python - unittest.mock:在指定的模拟对象上设置自定义属性(变量)
- c# - 动态添加键,值解析数组放入 Object.property = value 模式
- javascript - 无法在 C# 中打开 MSSQL 数据库
- javascript - 我需要在 Google 表格上重新定义脚本
- maven - 好友 devops 构建失败:java11
- azure - 个人帐户出现在 Azure AD 中