我刚刚写了这篇文章,就目前而言这很好:
import com.github.salomonbrys.kotson.get
import com.github.salomonbrys.kotson.int
import com.github.salomonbrys.kotson.jsonObject
import com.google.gson.JsonElement
import com.google.gson.JsonObject
abstract class BatchJobPayload {
abstract fun toJson(): JsonObject
}
class BookingConfirmationMessagePayload(val bookingId: Int) : BatchJobPayload() {
constructor(payload: JsonElement) : this(payload["bookingId"].int)
override fun toJson() = jsonObject(
"bookingId" to bookingId
)
}
但是如果可能的话,我想坚持所有扩展BatchJobPayload
的类实现带签名的辅助构造函数
constructor(payload: JsonElement): BatchJobPayload
,用于反序列化。
BookingConfirmationMessagePayload
有这样的构造函数但只是因为我把它放在那里,而不是因为BatchJobPayload
坚持它...
答案 0 :(得分:1)
您不能强制执行超级构造函数,但是您可以让工厂使用生成的spawn方法返回BatchJobPayload
的子类,这样可以确保类可以构造。
它看起来像这样:
class JsonObject // Included to make compiler happy
abstract class Factory<T> {
abstract fun make(obj: JsonObject): T
}
abstract class Base {
abstract fun toJson(): JsonObject
}
class A(val data:JsonObject):Base() {
override fun toJson(): JsonObject {
return JsonObject()
}
}
class AFactory: Factory<A>() {
override fun make(obj: JsonObject): A {
return A(obj)
}
}
fun main(args: Array<String>) {
val dummyJson = JsonObject()
var factory = AFactory()
var instance = factory.make(dummyJson)
println(instance)
}
答案 1 :(得分:1)
我提出了一个可行的选项,如下所示:
interface BatchJobPayload {
fun toJson(): JsonObject
}
interface BatchJobPayloadDeserialize {
operator fun invoke(payload: JsonElement): BatchJobPayload
}
class BookingConfirmationMessagePayload(val bookingId: Int) : BatchJobPayload {
override fun toJson() = jsonObject(
"bookingId" to bookingId
)
}
class BookingConfirmationMessagePayloadDeserialize : BatchJobPayloadDeserialize {
override operator fun invoke(payload: JsonElement) =
BookingConfirmationMessagePayload(payload["bookingId"].int)
}
现在您可以从BookingConfirmationMessagePayload
反序列化JsonElement
对象,如下所示:
BookingConfirmationMessagePayloadDeserialize()(payload)
(invoke
运算符只是一些语法糖,可能与钝点接近......)
实际上我还是比较粗略的原始代码---未来需要子类BatchJobPayload
的开发人员最初可能会忽略定义一个JsonElement
的构造函数,但他们肯定会意识到一旦他们只有一串JSON,他们需要把它们变成他们新类的一个实例...