这是我的尝试:
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,但不要看怎么做。我有很多具有零实例的类。
答案 0 :(得分:3)
有几种不同的方法可以做到这一点。您可以使用sealed
或open
类作为实际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)
}
}