我有一个类,它是2个类的摘要。我把这个类变成了一个数据类,如下所示
// Option 1
NumberFormat fmt = NumberFormat.getPercentInstance();
fmt.setMaximumFractionDigits(1);
// Option 2
NumberFormat fmt = new DecimalFormat("0.#%");
但是,当我打印此类时,它不会打印名称,ID,模式和强度属性,它会打印设备模型和设备状态。有没有办法让类根据派生属性生成toString而不是构造函数?
答案 0 :(得分:6)
您可以覆盖toString()
方法并提供所需的任何实现,而不是默认的编译器生成的实现。
答案 1 :(得分:2)
DeviceModel和DeviceStatusModel用于toString(),因为您通过主构造函数将它们声明为属性以执行您想要的操作,您必须使用辅助构造函数,您可以从中调用主构造函数,您将在其中声明您希望在toString()中看到的属性如下:
import kotlin.properties.Delegates
import kotlin.collections.MutableList
const val DEVICE_MODE_MANUAL = 10
const val DEVICE_MODE_AUTO = 20
const val DEVICE_MODE_OVERRIDE = 30
data class Device private constructor ( val name: String, val id: Int, val mode: Int, val strength: Int ) {
constructor( deviceModel: DeviceModel, deviceStatus: DeviceStatusModel ) :
this(
name = deviceModel.name ?: "Unknown",
id = deviceModel.id ?: -1,
mode = when(deviceStatus.mode) {
1 -> DEVICE_MODE_MANUAL
2 -> DEVICE_MODE_AUTO
3 -> DEVICE_MODE_OVERRIDE
else -> DEVICE_MODE_MANUAL
},
strength = deviceStatus.strength ?: 0
)
}
data class DeviceModel( val name: String, val id: Int )
data class DeviceStatusModel( val mode: Int, val strength: Int )
fun main(args: Array<String>) {
val deviceModel = DeviceModel( "Test ", 35 )
val deviceStatusModel = DeviceStatusModel( 1, 42 )
val device = Device( deviceModel, deviceStatusModel )
println( device )
}
NB :我认为你不希望别人以其他方式实例化你的对象,而不是通过DeviceModel和DeviceStatusModel,所以我将主构造函数设为私有