搜索 kotlin 空数据 class 主构造函数的解决方法
Searching a workaround for kotlin empty data class primary constructor
使用给定的 kotlin 代码:
sealed class Event(val id:String= UUID.randomUUID().toString(), val timestamp:Instant = Instant.now())
data class BarEvent(val additionalInfo:String):Event()
object FooEvent:Event()
// data class CorrectFooEvent():Event() // invalid kotlin
fun main(args: Array<String>) {
val b1 = BarEvent("b1")
val f1 = FooEvent
Thread.sleep(1000)
val b2 = BarEvent("b2")
val f2 = FooEvent
println("${b1.id} ${b1.timestamp} $b1")
println("${f1.id} ${f1.timestamp} $f1")
println("${b2.id} ${b2.timestamp} $b2")
println("${f2.id} ${f2.timestamp} $f2")
}
BarEvent
没有问题。
但是由于 FooEvent
的参数不比 Event
中的参数多,我希望它有一个空的构造函数。它没有数据class的授权,所以我把它作为一个对象。但是对象是单例的,所以它不表现为实例化事件。
我看到的唯一解决方法(将 class 保留为 data class
)类似于:
sealed class Event(open val id:String= UUID.randomUUID().toString(), open val timestamp:Instant = Instant.now())
data class FooEvent(override val id:String= UUID.randomUUID().toString(), override val timestamp:Instant = Instant.now()):Event()
但不是很优雅
只需将 FooEvent
更改为正常的 class,然后添加(或使用您的 IDE 生成它们)toString()
、hashCode()
和 equals(Object)
如果需要:
class FooEvent: Event() {
override hashCode() = ...
override equals(other: Object) {
...
}
override toString() = ...
}
要使事件成为数据 class,只需向其中添加一个未使用的 属性。不漂亮,但目前在 Kotlin 中尽可能短:
data class FooEvent(val dummy: Unit = Unit) : Event()
似乎无意很快取消此限制:
使用给定的 kotlin 代码:
sealed class Event(val id:String= UUID.randomUUID().toString(), val timestamp:Instant = Instant.now())
data class BarEvent(val additionalInfo:String):Event()
object FooEvent:Event()
// data class CorrectFooEvent():Event() // invalid kotlin
fun main(args: Array<String>) {
val b1 = BarEvent("b1")
val f1 = FooEvent
Thread.sleep(1000)
val b2 = BarEvent("b2")
val f2 = FooEvent
println("${b1.id} ${b1.timestamp} $b1")
println("${f1.id} ${f1.timestamp} $f1")
println("${b2.id} ${b2.timestamp} $b2")
println("${f2.id} ${f2.timestamp} $f2")
}
BarEvent
没有问题。
但是由于 FooEvent
的参数不比 Event
中的参数多,我希望它有一个空的构造函数。它没有数据class的授权,所以我把它作为一个对象。但是对象是单例的,所以它不表现为实例化事件。
我看到的唯一解决方法(将 class 保留为 data class
)类似于:
sealed class Event(open val id:String= UUID.randomUUID().toString(), open val timestamp:Instant = Instant.now())
data class FooEvent(override val id:String= UUID.randomUUID().toString(), override val timestamp:Instant = Instant.now()):Event()
但不是很优雅
只需将 FooEvent
更改为正常的 class,然后添加(或使用您的 IDE 生成它们)toString()
、hashCode()
和 equals(Object)
如果需要:
class FooEvent: Event() {
override hashCode() = ...
override equals(other: Object) {
...
}
override toString() = ...
}
要使事件成为数据 class,只需向其中添加一个未使用的 属性。不漂亮,但目前在 Kotlin 中尽可能短:
data class FooEvent(val dummy: Unit = Unit) : Event()
似乎无意很快取消此限制: