data class Person(
private val head: String,
val hand: String
) {
}
val p = Person("head", "hand")
Log.d("Alex", "Person = $p")
打印结果:
2023-06-11 22:30:54.764 21840-21840 Alex com.example.myapplication2 D Person = Person(head=head, hand=hand)
如上所示,这里有一个实体,有2个成员变量,外面可以直接构造,没毛病,
如果此时扩展这个实体的成员变量,业务方不知情的条件下,就会构造失败,直接crash了,这是一个很严重的问题,如下代码:
data class Person(
private val head: String,
val hand: String,
val foot: String
) {
}
这种情况会发生在高低版本的兼容性上,假如业务方不知道这个实体的构造参数发生了改变,或者说已经发出去了的旧版本没法修改这个构造了,怎么解决呢?
这里有2种方法可以解决,这里做个记录哈;
解决方法一、给主构造函数的增加的参数附上默认值,且不能修改之前构造参数的位置,放于末尾,如下:
data class Person(
private val head: String,
val hand: String,
val foot: String = "foot"
) {
}
编译器已经没有报错了;
解决方法二、实体增加一个次构造函数,如下:
data class Person(
private val head: String,
val hand: String,
val foot: String
) {
constructor(
head: String,
hand: String
) : this(
head,
hand,
"foot"
)
}
编译器依然没错,
打印结果:
2023-06-11 22:53:21.620 32712-32712 Alex com.example.myapplication2 D Person = Person(head=head, hand=hand, foot=foot)
关键字constructor代表次构造函数,这个的构造参数可以不变,留给业务方调用,当new这个次构造函数时,就会调用主构造函数,主构造函数中增加的构造参数传入了默认值,所以就没问题;
好了,又可以愉快的玩耍了。
相关文章:
kotlin 构造函数传参的理解_Alex老夫子的博客-CSDN博客