В своем коде я использую шаблон Kotlin "type-safe builder":
insteadOf("search", "forest|ground") {
println("Do something.");
}
Однако я также использую Kryo для сериализации данных (сохранения игры), и Kryo не нравитсяанонимный тип:
call: () -> Unit
Поэтому мне пришлось ввести интерфейс «Do» вместо вышеуказанного типа.Но теперь мой код выглядит намного ужаснее:
insteadOf("search", "forest|ground", object : World.InsteadOf.Do {
override fun invoke() {
println("Do something")
}
})
Как я могу использовать простой {} - синтаксис с Do-интерфейсом?
РЕДАКТИРОВАТЬ:
Вот некоторые пояснения.
Я в некотором замешательстве (не новость).
Фактическое сообщение об ошибке Kryo, похоже, касается конструктора без аргументов, однако сразу после этого оноговорит: «Это анонимный класс, который в Kryo по умолчанию не сериализуем».
Вот полное сообщение об ошибке:
Exception in thread "main" com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): fi.starstuff.rogue.World$insteadOf$1
This is an anonymous class, which is not serializable by default in Kryo. Possible solutions: 1. Remove uses of anonymous classes, including double brace initialization, from the containing class. This is the safest solution, as anonymous classes don't have predictable names for serialization.
2. Register a FieldSerializer for the containing class and call FieldSerializer#setIgnoreSyntheticFields(false) on it. This is not safe but may be sufficient temporarily. Use at your own risk.
Serialization trace:
call (com.mygame.World$InsteadOf)
insteadOfs (com.mygame.World)
at com.esotericsoftware.kryo.Kryo$DefaultInstantiatorStrategy.newInstantiatorOf(Kryo.java:1319)
at com.esotericsoftware.kryo.Kryo.newInstantiator(Kryo.java:1127)
at com.esotericsoftware.kryo.Kryo.newInstance(Kryo.java:1136)
Вот класс ВместоOf:
class InsteadOf {
var verbs: Array<String> = arrayOf()
var nouns: Array<String> = arrayOf()
var where: String = ""
var call: (() -> Unit)? = null
}