kotlin 解决构造函数兼容性问题

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博客

猜你喜欢

转载自blog.csdn.net/msn465780/article/details/131158935
今日推荐