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)
只是想知道最好和最简单的解决方案是什么?
我认为你的假设是不正确的。使用
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)