当一个参数是一个类时,使用默认值初始化一个类

ant*_*009 3 kotlin

kotlin 1.2.60
Run Code Online (Sandbox Code Playgroud)

我有以下数据类,我想用默认值初始化它们。但是,我不确定如何在硬盘是一个类时初始化它。

我尝试执行以下操作,但这将创建一个新的 HeadDisk 对象,而不是我想要的:

data class HeadDisk(var size: Float,
                    var manufacturer: Manufacturer)

data class Computer(var speed: Float = 0F,
                    var screenSize: Float = 0F,
                    var hardDisk: HeadDisk = HeadDisk())
Run Code Online (Sandbox Code Playgroud)

我可以通过显式将其设置为空值来将其设置为空。但我不想明确地将其设置为空。

data class Computer(var speed: Float = 0F,
                    var screenSize: Float = 0F,
                    var hardDisk: HeadDisk? = null)
Run Code Online (Sandbox Code Playgroud)

或者使用 delegate 执行以下操作:

data class Computer(var speed: Float = 0F,
                    var screenSize: Float = 0F) {

    var hardDisk: HeadDisk by Delegates.notNull()
}
Run Code Online (Sandbox Code Playgroud)

只是想知道最好和最简单的解决方案是什么?

zap*_*apl 5

我认为你的假设是不正确的。使用

data class Computer(var speed: Float = 0F,
                    var screenSize: Float = 0F,
                    var hardDisk: HeadDisk = HeadDisk())
Run Code Online (Sandbox Code Playgroud)

HeadDisk()除非需要,否则不会创建默认值。生成的 Java 代码为

class Foo
class Bar(val foo: Foo = Foo())
Run Code Online (Sandbox Code Playgroud)

// $FF: synthetic method
public Bar(Foo var1, int var2, DefaultConstructorMarker var3) {
   if ((var2 & 1) != 0) { // this checks whether you called it with or without that parameter
      var1 = new Foo(); // a new one each time
   }
   this(var1);
}
Run Code Online (Sandbox Code Playgroud)