Переменная null при запуске и не может быть нулевой после инициализации - PullRequest
0 голосов
/ 01 июля 2018

Есть ли способ аннотировать переменную в Kotlin, которая равна null при запуске приложения, и после того, как оно создано, его нельзя присвоить null снова?

Я не могу установить поле, например, var someField: Boolean? потому что он может быть обнулен в какой-то момент или lateinit var someField: Boolean, потому что ожидается, что поле инициализируется до того, как оно будет использовано (или, возможно, это правильный способ разрешить мою ситуацию?).

Ответы [ 4 ]

0 голосов
/ 01 июля 2018

При использовании более сложного типа, чем Boolean, вы должны рассмотреть реализацию шаблона Null-Value-Pattern вокруг него. Kotlin предлагает удобную структуру для такого варианта использования:

sealed class Base

object NotInitialized : Base()

class Initialized : Base()

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

0 голосов
/ 01 июля 2018

Я не уверен, что понимаю, почему lateinit не работает для вас, кроме того, что он не работает для примитивных типов - но делегат notNull может быть тем, что вы ' ищу:

class X {
    var z: String by Delegates.notNull()
}

val x1 = X()
x1.z = "foo"
println(x1.z) // foo

val x2 = X()
println(x2.z) // IllegalStateException: Property z should be initialized before get.

Это даст вам исключение, если вы прочитаете его перед установкой, в противном случае свойство будет иметь ненулевой тип.

0 голосов
/ 01 июля 2018

Объявите это с помощью latenit: lateinit var someField: Boolean
и после того, как вы назначите ненулевое значение, используйте его следующим образом someField!!
С помощью этой аннотации вы говорите компилятору, что somefield не является null, но вы несете ответственность за сохранение его ненулевым.

0 голосов
/ 01 июля 2018

Я не уверен, потому что я действительно не вижу, что вы хотите сделать, но почему вы не создаете переменную, когда инициализируете ее? Таким образом, переменная никогда не будет нулевой, и вам не придется начинать ее с нуля

Если вам действительно нужен этот var, чтобы проверить, не является ли он нулевым, чтобы изменить его, почему вы не используете int вместо bool?

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