搜索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中不推荐使用。 为什么?
- 对无参数数据类的建议