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

用给定的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) { 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() 

似乎没有打算立即删除这个限制:

  • 不带参数的数据类在1.0中不推荐使用。 为什么?
  • 对无参数数据类的建议