带有派生属性的Kotlin数据类

时间:2017-03-04 04:03:57

标签: android kotlin

我有一个类,它是2个类的摘要。我把这个类变成了一个数据类,如下所示

// Option 1
NumberFormat fmt = NumberFormat.getPercentInstance();
fmt.setMaximumFractionDigits(1);

// Option 2
NumberFormat fmt = new DecimalFormat("0.#%");

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

2 个答案:

答案 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,所以我将主构造函数设为私有