В java мы можем сделать следующее
class A{ int id; String name; public A(){} public A(int id, String name){ this.id = id; this.name = name; } // getter/ setter }
то я могу создать новый объект и получить json как следующий
A a= new A() a.setName("test") System.out.println(new Gson().toJson(a))
что дает мне результат
{"name":"test"}
В котлин, как я могу это достичь?
Проблема, с которой я столкнулся, – это котлин, говорящий, что примитивный тип должен быть инициализирован. Итак, в json я получаю как id
и name
; который я не хочу
Итак, как это сделать ???
Kotlint серьезно относится к нулевой безопасности, поэтому вы должны явно указывать значения инициализации. Ваш пример можно перевести на:
class A(var id: Int? = null, var name: String? = null)
Обратите внимание, что вышеприведенные аргументы по умолчанию и конструктор без параметров на JVM . Это позволит вам написать:
val a = A()
Так же как:
val a = gson.fromJson(json, A::class.java)
Как насчет lateinit
?
/* ***************************************************************************/ class A() { lateinit var id : Integer // Integer instead of Int due to lateinit's no-primitives requirement lateinit var name : String constructor(id : Integer, name : String) : this() { this.id = id this.name = name } } /* ***************************************************************************/ /* ***************************************************************************/ fun main(args: Array<String>) { val a = A() a.name = "test" assert(Gson().toJson(a) == """{"name":"test"}""") val aFromJson = Gson().fromJson("""{"name":"test"}""", A::class.java) assert(a.name == "test") } /* ***************************************************************************/
Преимущество использования lateinit
заключается в отсутствии свойств lateinit
внутри класса, таким образом, вы избегаете иметь дело с пустом нулевой проверки и ?.
derefering.