Нужно ли инициализировать пустые поля в kotlin? - PullRequest
0 голосов
/ 16 ноября 2018

Я недавно просмотрел некоторые коды котлина, все пустые поля инициализированы как ноль.

В чем разница между val x : String? = null и val x : String?

Должны ли мы инициализировать пустые поля как нулевые?

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

val x : String? создаст неинициализированную переменную или свойство, в зависимости от того, где оно определено.Если он находится в классе (а не в функции), он создает свойство, и вы не можете создать неинициализированное свойство, если оно не абстрактное.Например, возьмите этот код:

class MyClass {
    val x : String?
}

Это не скомпилируется.Вы получите Property must be initialized or be abstract.

Этот код, однако, скомпилирует

class MyClass {
    fun test() {
        val x : String?
    }
}

Однако это немного бессмысленно, так как вы не сможете ссылаться на эту переменную: как тольковы получите, вы получите Variable 'x' must be initialized.

Так что да, как правило, при определении обнуляемого члена вы должны инициализировать его (например, значением null), если оно не абстрактное, в этом случае переопределяющий класс должен его инициализировать.

0 голосов
/ 16 ноября 2018

Все, даже обнуляемые переменные и примитивы, должны быть инициализированы в Kotlin. Вы можете, как уже упоминалось, пометить их как абстрактные, если вам требуется переопределение. Однако если у вас есть интерфейс, вам не нужно его инициализировать. Это не скомпилируется:

class Whatever {
    private var x: String? 
}

но это будет:

interface IWhatever {
    protected var x: String?
}

Это тоже:

abstract class Whatever {
    protected abstract var x: String?
}

Если он объявлен в методе, вам не нужно инициализировать его напрямую, если он инициализирован до получения доступа. Это точно так же, как в Java, если вы знакомы с ним.

Если вы не инициализируете его в конструкторе, вам нужно использовать lateinit. Или, если у вас есть val, вы можете переопределить get:

val something: String?
    get() = "Some fallback. This doesn't need initialization because the getter is overridden, but if you use a different field here, you naturally need to initialize that"

Как я открыл, даже обнуляемые переменные должны быть инициализированы. Так устроен Котлин, и нет пути к этому. Так что да, вам нужно явно инициализировать строку как ноль, если вы не инициализируете ее чем-то другим сразу.

0 голосов
/ 16 ноября 2018

Свойство должно быть инициализировано.Поэтому вы должны выполнить инициализацию var x : String? = null.Не присваивать значение - это только объявление свойства, и поэтому вам нужно сделать его абстрактным abstract val x : String?.

В качестве альтернативы вы можете использовать lateinit, также для ненулевых типов.Но это приводит к тому, что он не нулевой, а неинициализированный lateinit var x : String.

...