是否有一种标准的Kotlin方法可以使这个数据类的特殊对象具有不同的toString()方法?

时间:2018-01-19 02:09:17

标签: kotlin

这是我的尝试:

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,但不要看怎么做。我有很多具有零实例的类。

1 个答案:

答案 0 :(得分:3)

有几种不同的方法可以做到这一点。您可以使用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<String>) {
    // only able to access it as
    LineStyle.NoLine
}

但是,使用这种方法,您将失去该类的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)    
    }

}