kotlin无参构造

272 阅读1分钟

前言

在Java中创建一个对象有三种方式:

  1. 通过new字段创建
  2. 通过反射构造方法来创建对象
  3. Unsafe类创建实例

Unsafe类创建实例

Unsafe类创建对象没有使用构造方法,使用了Field unsafe.allocateInstance(xxx.class);

kotlin空安全

fun one(msg:String){

}
fun two(msg:String?){

}

反编译java后发现one方法中有Intrinsics.checkParameterNotNull(msg,"msg");检查的方法。如果java 调用one传入null是会异常的。

class KUser1(var name:String)
data class KUser2(var name:String)

kotlin中不管是class还是data class都不会帮助生成无参构造函数。但是java是默认生成无参构造函数的。

但是给构造函数默认值,则会帮助生成无参构造函数的。

class KUser3(var name: String = "")

kotlin 序列化

kotlin序列化或反序列化框架正常工作,最好提供以下无参构造函数。

data class KUser(var name:String="123",var age:Int)



fun main(){
    val gson= Gson()
    val person=gson.fromJson<KUser>(""" {"age":"12"} """,KUser::class.java)

    println(person.name)
}
// 没有无参构造函数,有属性没有默认值,用unsafe构造出函数,不管你给没给默认值,所有的属性都为null
输出:null
//不会空指针异常

Koltin中有n个属性,必须把n个属性都设置了默认值,才会生成默认的无参构造函数,少一个都不会生成无参构造函数。在没有无参构造函数,gson的反序列化走了unsafe直接构造出了对象,绕过了kotlin的空安全判定,所以不报错,输出null。