Kotlin data class 数据类用法

文章探讨了Kotlin数据类的copy()方法在创建对象副本时的行为,特别是在继承结构中。示例展示了当数据类继承普通类时,copy()方法可能不按预期工作,进行的是浅拷贝。建议在复杂情况下自定义复制函数以确保正确复制所有属性。此外,还提到了JSON解析与数据类之间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验数据

{
    "code":1,
    "message":"成功",
    "data":{
        "name":"周杰轮",
        "gender":1
    }
}

kotlin数据类使用方便提供如下内部Api:

  1. equals()/hashCode()对

  2. toString()

  3. componentN()按声明顺序与属性相对应的函数。

  4. copy()功能

这里主要关注3,4,分别表示解构,和简单的对象浅拷贝实现 ,具体用法如下用例:

对于data类继承普通类之后,data类使用copy会与预期不符。

open class Person(val name: String? = "")
data class StuProJO(val gender: Int? = null) : Person(name = "")

data class Normal(val name: String? = null, val age: Int = 18, var gender: Int? = 0)


/**
 * 对于数据类Normal,copy方法执行符合预期。属于浅拷贝
 */
fun main2(args: Array<String>) {
    //解构
    val (var1, var2, var3) = Normal("周杰轮", 18, 1)
    println("$var1 $var2 $var3")
    val normal2= Normal("周杰轮", 18, 2)
    //浅拷贝
    println(normal2.copy(name = "周杰轮2"))

}

//输出
//Normal(name=周杰轮, age=18, gender=1)
//Normal(name=周杰轮2, age=18, gender=1)



/**
 * 继承方式结果与预期不符
 *
 */
fun main(args: Array<String>) {
    val temp = try {
        JsonParser.parseString(student) as JsonObject
    } catch (e: JsonParseException) {
        JsonObject()
    }
    val jsonObject = temp.takeIf { it.has("data") }
    val metaObject = jsonObject?.get("data")
    val metaData = metaObject.toString()
    var studentOB = GsonHelper.getClassFromJsonString(metaData, StuProJO::class.java)
    println(studentOB.toString())
    println(studentOB.name)

    printProjo(studentOB.copy(gender = 10000))

}

fun printProjo(person: Person) {
    print("打印 ${person} 继承的姓名:${person.name}")
}

//输出
//StuProJO(gender=1)
//周杰轮
//打印 StuProJO(gender=10000) 继承的姓名:

上面copy()用例与预期不符原因根据官方提供说明

data class User(val name: String = “”, val age: Int = 0)
使用该copy()函数复制对象,允许您更改其某些属性,同时保持其余属性不变。上面类的这个函数的实现User如下:
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

对于复杂copy()用例,建议自定义函数来处理

stackoverflow:相关用例 Kotlin data class copy method not deep copying all members

工具类

public class GsonHelper {

    private static Gson sGson;

    private GsonHelper() {
    }

    public static synchronized Gson getGsonInstance() {
        if (sGson == null) {
            sGson = new Gson();
        }
        return sGson;
    }

    private static <T> T fromJson(String json, Type typeOfT) {
        try {
            return getGsonInstance().fromJson(json, typeOfT);
        } catch (JsonSyntaxException e) {
            e.printStackTrace();
        }
        return null;
    }


    public static <T extends Object> T getClassFromJsonString(String data, Class<T> clazz) {
        return fromJson(data, clazz);
    }

}

kotlin office data class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯塔@kuaidao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值