有没有一个标准的Kotlin方法来使这个数据类的特殊对象有一个不同的toString()方法?

这是我的尝试:

data class LineStyle(val thickness: Float) { override fun toString() = if (thickness == 0f) { "NO_LINE" } else { "LineStyle(${thickness}f)" } companion object { @JvmField val NO_LINE = LineStyle(0f) } } 

我宁愿为NO_LINE单例分别重写toString,但不知道如何。 我有很多有零实例的类。

有几种不同的方法可以做到这一点。 您可以使用sealedopen类作为您的实际LineStyle并将NoLine作为伴随对象,强制您将其称为LineStyle.NoLine 。 在那个对象中,你可以用任何你想要的方法覆盖实际的toString()方法。 实现将如下所示:

 // sealed so it's easier to deal with in when statements sealed class LineStyle(val thickness: Float) { // defines a no line style companion object NoLine: LineStyle(0f) { override fun toString() = "NO_LINE" } } fun main(args: Array) { // only able to access it as LineStyle.NoLine } 

但是,使用这种方法,您将失去class级的data方面。 唯一的其他选择是基本上做你所做的,相反,也许使用when语句,但为了将来的可扩展性。 这不是最漂亮的,但它的工作原理:

 data class LineStyle(val thickness: Float) { // if you want extensibility, you could use a when statement override fun toString() = if(this == NO_LINE) "NO_LINE" else super.toString() companion object { val NO_LINE = LineStyle(0f) } }