Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 当一个参数是类时,使用默认值初始化类_Kotlin - Fatal编程技术网

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

Kotlin 当一个参数是类时,使用默认值初始化类,kotlin,Kotlin,我有以下数据类,我想用默认值初始化它们。但是,我不确定当硬盘是一个类时如何初始化它 我已尝试执行以下操作,但这将创建一个新的HeadDisk对象,而不是我想要的: kotlin 1.2.60 我可以通过显式地将其设置为null值来将其设置为null。但我不想显式地将其设置为null data class HeadDisk(var size: Float, var manufacturer: Manufacturer) data class Comput

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

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

kotlin 1.2.60
我可以通过显式地将其设置为null值来将其设置为null。但我不想显式地将其设置为null

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

data class Computer(var speed: Float = 0F,
                    var screenSize: Float = 0F,
                    var hardDisk: HeadDisk = HeadDisk())
或者对委托人执行以下操作:

data class Computer(var speed: Float = 0F,
                    var screenSize: Float = 0F,
                    var hardDisk: HeadDisk? = null)

只是想知道解决这个问题的最佳和最简单的解决方案是什么?

我想您应该在这里使用,因为构造函数中不支持委托和lateinit变量。我通常是这样做的:

//简单例子

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

    var hardDisk: HeadDisk by Delegates.notNull()
}
因此我有一个
val
,它表示
没有值的状态


另一个解决方案是使用
可选
选项
中的数据类型

我认为您的假设是错误的。使用

class Foo(val bar: String = NO_BAR) {

    // note the instance equality check
    fun hasBar() = bar !== NO_BAR

    companion object {

        val NO_BAR = UUID.randomUUID().toString()
    }
}
除非需要,否则不会创建默认的
HeadDisk()
。生成的Java代码

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


我不知道你想要什么,你想用一个HeadDisk实例初始化它,但你不想创建一个新的HeadDisk实例?因为这就是我对你问题的解释。您希望默认值到底是什么?您的问题确实不清楚。你想看到什么样的行为?我的意思是,最后一个示例强制用户提供一个值,因此没有defalult。在第一个示例中,该属性始终是有效值,用户无需提供有效值。中间的一个允许用户提供一个值,但是如果没有,那么它必须处理空的情况。所有这些都是有效的用例,但这完全取决于您想要什么。IMHO“默认情况下”我会选择最简单的解决方案,即数字1,因为它是“最安全的类型”,使用起来更统一。但这取决于…也许我不清楚。基本上,我想为初始化类设置默认值。这就是我在构造函数中指定默认值的原因。问题是如何为类硬盘设置默认值?我希望我现在更清楚了。
class Foo
class Bar(val foo: Foo = Foo())
// $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);
}