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所以我做了主構造私人
謝謝,這是一個聰明的解決方案,它允許在調用默認的toString的同時爲調用者保留一個簡單的構造函數。 – Francesc