实验数据
{
"code":1,
"message":"成功",
"data":{
"name":"周杰轮",
"gender":1
}
}
kotlin数据类使用方便提供如下内部Api:
-
equals()/hashCode()对
-
toString()
-
componentN()按声明顺序与属性相对应的函数。
-
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);
}
}