我们如何通过Java代码创建一个Student对象?
我们先想下通过Java创建对象大概有哪些方式:
-
new Student() // 私有
-
反射调用构造方法 //throw ex
-
反序列化 // 需要实现相关序列化接口
-
clone // 需要实现clone相关接口
-
…
好了,已经超出我的知识点范畴了。
不免心中嘀咕:
这题目太偏了,毫无意义,而且文章标题是 Android 避坑指南,看起来毫无关系
是的,确实很偏,跳过这个问题,我们往下看,看看是怎么在Android开发过程中遇到的,而且看完后,这个问题就迎刃而解了。
上周一个群有个小伙伴,遇到了一个Kotlin写的Bean,在做Gson将字符串转化成具体的Bean对象时,发生了一个不符合预期的问题。
因为是他们项目的代码,我就不贴了,我写了个类似的小例子来替代。
对于Java Bean,kotlin可以用data class,网上也有很多博客表示:
在 Kotlin 中,不需要自己动手去写一个 JavaBean,可以直接使用 DataClass,使用 DataClass 编译器会默默地帮我们生成一些函数。
我们先写个Bean:
data class Person(var name: String, var age: Int) {
}
这个Bean是用于接收服务器数据,通过Gson转化为对象的。
简化一下代码为:
val gson = Gson()
val person = gson.fromJson(“{“age”:“12”}”, Person::class.java)
我们传递了一个json字符串,但是没有包含key为name的值,并且注意:
在Person中name的类型是String,也就是说是不允许name=null的
那么上面的代码,我运行起来结果是什么呢?
-
报错,毕竟没有传name的值;
-
不报错,name 默认值为"";
-
不报错,name=null;
感觉1最合理,也符合Kotlin的空安全检查。
验证一下,修改一下代码,看一下输出:
val gson = Gson()
val person = gson.fromJson(“{“age”:“12”}”, Person::class.java)
println(person.name )
输出结果:
null
是不是有些奇怪,感觉意外绕过了Kotlin的空类型检查。
所以那位出问题的同学,在这里之后数据就出了问题,导致一直排查困难。
我们再改一下代码:
data class Person(var name: String, var age: Int): People(){
}
我们让Person继承自People类:
public class People {