Инициализируйте класс значениями по умолчанию, если один параметр является классом - PullRequest
0 голосов
/ 15 октября 2018
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 ]

0 голосов
/ 15 октября 2018

Я думаю, что ваше предположение неверно.Используйте

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);
}
0 голосов
/ 15 октября 2018

Я думаю, вы должны использовать шаблон нулевого объекта здесь, я думаю, так как делегаты и переменные lateinit не поддерживаются в конструкторах.Обычно я делаю что-то вроде этого:

// простой пример

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...