具有派生属性的Kotlin数据类

我有一堂课是两堂课的总结。 我把这个类做成了一个数据类,如下所示

data class Device(private val deviceModel: DeviceModel, private val deviceStatus: DeviceStatusModel) { val name = deviceModel.name ?: "Unknown" val id = deviceModel.id ?: -1 val mode = when(deviceStatus.mode) { 1 -> DEVICE_MODE_MANUAL 2 -> DEVICE_MODE_AUTO 3 -> DEVICE_MODE_OVERRIDE else -> DEVICE_MODE_MANUAL } val strength = deviceStatus.strength ?: 0 } 

但是,当我打印这个类时,它不打印名称,ID,模式和强度属性,它打印设备型号和设备状态。 有没有办法让类生成toString基于派生属性而不是构造函数?

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 ) } 

:我想你不希望人们通过其他方式实例化你的对象,而不是通过DeviceModel和DeviceStatusModel,所以我做了主要的构造函数私人

您可以重写toString()方法,并提供您需要的任何实现,而不是默认的编译器生成的实现。