Я пытаюсь создать DSL для создания JSONObjects. Вот класс строитель и использование образца:Kotlin DSL для создания объектов json (без создания мусора)
import org.json.JSONObject
fun json(build: JsonObjectBuilder.() -> Unit): JSONObject {
val builder = JsonObjectBuilder()
builder.build()
return builder.json
}
class JsonObjectBuilder {
val json = JSONObject()
infix fun <T> String.To(value: T) {
json.put(this, value)
}
}
fun main(args: Array<String>) {
val jsonObject =
json {
"name" To "ilkin"
"age" To 37
"male" To true
"contact" To json {
"city" To "istanbul"
"email" To "[email protected]"
}
}
println(jsonObject)
}
Выход выше код:
{"contact":{"city":"istanbul","email":"[email protected]"},"name":"ilkin","age":37,"male":true}
Он работает, как ожидалось. Но он создает дополнительный экземпляр JsonObjectBuilder каждый раз, когда он создает объект json. Можно ли написать DSL для создания объектов json без лишнего мусора?
Kotlin должен создать объект функции, который должен быть передан в 'json {...}', поэтому проблема «создать лишние объекты» является ошибочной с самого начала. JVM достаточно эффективен в оптимизации коротких объектов. Если вы не сравните свой код с кодом и на 100% уверены, что создание экземпляров 'JSONObjectBuilder 'является узким местом вашей производительности, я бы не стал об этом беспокоиться. (Личное примечание: я бы сделал ваш строитель интерфейсом и спрятал фактическую реализацию в частном классе, поэтому вы не открываете поле json.) –
Yep, 'json {...}' должно быть, должно быть 'inline' – voddan