kotlin - 搜索 kotlin 空数据类主构造函数的解决方法

标签 kotlin data-class

使用给定的 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 中的参数更多的参数,我希望它有空的构造函数。它没有被授权用于数据类,所以我将它作为一个对象。但对象是单例的,因此它不会表现为实例化事件。

我看到的唯一解决方法(将类保留为数据类)类似于:

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()

似乎无意很快取消此限制:

关于kotlin - 搜索 kotlin 空数据类主构造函数的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47807755/

相关文章:

kotlin - 为什么 Kotlin 反编译器生成 null.INSTANCE

java - 从 Java 生成 Kotlin 接口(interface)类会生成错误

kotlin - Kotlin-是否可以将属性值传递给具有相同名称的属性的另一个对象?

spring - 如何在后期初始化中保留不可为空的属性

android - 如何在android中将Kotlin的数据类列表导出为CSV?

Kotlin 集合 : Can you optionally key data classes by identity?

listener - Kotlin 推荐的使用 SAM 注销监听器的方法

java - Kotlin 中的赋值链?

android - kotlin:数据类中的可变属性类型

android - Kotlin 中的外部 MySQL 数据库