代码之家  ›  专栏  ›  技术社区  ›  ant2009

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

  •  2
  • ant2009  · 技术社区  · 7 年前
    kotlin 1.2.60
    

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

    我已尝试执行以下操作,但这将创建一个新的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())
    

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

    或对委托执行以下操作:

    data class Computer(var speed: Float = 0F,
                        var screenSize: Float = 0F) {
    
        var hardDisk: HeadDisk by Delegates.notNull()
    }
    

    2 回复  |  直到 7 年前
        1
  •  3
  •   zapl    7 年前

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

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

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

    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);
    }
    
        2
  •  1
  •   Adam Arold    7 年前

    我认为你应该使用 null object pattern

    //简单的例子

    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()
        }
    }
    

    所以我有一个 val 代表了 has no value 州。

    Optional 或者 Option Arrow