Все, даже обнуляемые переменные и примитивы, должны быть инициализированы в 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"
Как я открыл, даже обнуляемые переменные должны быть инициализированы. Так устроен Котлин, и нет пути к этому. Так что да, вам нужно явно инициализировать строку как ноль, если вы не инициализируете ее чем-то другим сразу.