gpt4 book ai didi

kotlin - 搜索解决方案以获取Kotlin空数据类主构造函数

转载 作者:行者123 更新时间:2023-12-02 13:23:35 26 4
gpt4 key购买 nike

使用给定的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中的参数更多的参数,因此我希望它具有空的构造函数。它未经数据类授权,因此我将其作为对象。但是对象是单例,因此它不会表现为即时事件。

我看到的唯一解决方法(将类保留为 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更改为普通类,然后根据需要添加(或使用您的IDE生成它们)toString()hashCode()equals(Object):

class FooEvent: Event() {
override hashCode() = ...
override equals(other: Object) {
...
}
override toString() = ...
}

要使事件成为数据类,只需向其添加一个未使用的属性。虽然不漂亮,但目前在Kotlin中可能要短得多:
data class FooEvent(val dummy: Unit = Unit) : Event()

似乎无意尽快取消此限制:
  • Data class without arguments deprecated in 1.0. Why?
  • Suggestion for parameterless data class
  • 关于kotlin - 搜索解决方案以获取Kotlin空数据类主构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47807755/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com