Object 翻新在初始化时跳过数据类的init{}块
我将根据Object 翻新在初始化时跳过数据类的init{}块,object,kotlin,initialization,retrofit,pojo,Object,Kotlin,Initialization,Retrofit,Pojo,我将根据DClass abstract class Data(p: String) { var a1: String var a2: String init { """(\w+)(\d+)""".toRegex().find(p)!!.groupValues.run { a1 = "a1 is ${get(1)}" a2 = "a2 is ${get(2)}" } } } data
DClass
abstract class Data(p: String) {
var a1: String
var a2: String
init {
"""(\w+)(\d+)""".toRegex().find(p)!!.groupValues.run {
a1 = "a1 is ${get(1)}"
a2 = "a2 is ${get(2)}"
}
}
}
data class DClass(val p1: String, val p2: String) : Data(p1)
然后在创建DClass
之后,我能够获得a1
和a2
的值:
DClass("string1", "string2").run { println("$a1 $a2") }
它返回“a1是string
a2是1
”它应该返回的值
接下来,我将尝试通过正确的JSON响应进行改装初始化DClass:
@GET(“loadDClass”)挂起有趣的dClass():dClass
abstract class Data(p: String) {
var a1: String
var a2: String
init {
"""(\w+)(\d+)""".toRegex().find(p)!!.groupValues.run {
a1 = "a1 is ${get(1)}"
a2 = "a2 is ${get(2)}"
}
}
}
data class DClass(val p1: String, val p2: String) : Data(p1)
如果让程序执行与a1
和a2
相同的输出,它只会返回:
“a1为null
a2为null
”
因此,我发现init{}
块的数据
被跳过,因为改型只构建DClass
,而不进行初始化
是否可以不手动初始化抽象类的变量?不会调用
init
块,因为GsonConverterFactory
(我假设您使用它,因为它在这种情况下非常常见)以一种特殊的方式构造DClass
,而不调用其构造函数。特别是,使用了一个名为的内部类。该类的JavaDoc声明:
/**
* Do sneaky things to allocate objects without invoking their constructors.
* [...]
*/
您可以编写自己的改装Converter.Factory
,但那太过分了。我建议您向DClass
添加一个简单的成员函数,而不是从数据
继承,并从数据
中删除摘要
关键字DClass
应如下所示:
data class DClass(val p1: String, val p2: String)
fun newData(): Data = Data(p1)
}
然后,您可以从响应的body()
构建Data
实例:
call.execute().body()?.newData()?.run { println("$a1 $a2") }