Лучшая практика для нулевой безопасности в Котлине - PullRequest
0 голосов
/ 05 июня 2018

Я сейчас нахожусь в процессе изучения Kotlin для замены Java в моих приложениях для Android, но я борюсь с нулевой безопасностью.

Я знакомлюсь с процессом обработки нулевых и ненулевых переменных, однако до сих пор не уверен в «наилучшей практике» с точки зрения реализации нулевых / ненулевых переменных в Kotlin.

Например, в Java я написал бы что-то вроде:

UserAccount account;

if (account == null) {
    openLogin();
}

Я понимаю, что могу повторить это в Kotlin, но кажется, что язык разработан так, чтобы избежать подобной практики.Как мне реализовать эту систему с помощью Kotlin, если я добавлю переменную, допускающую значение NULL?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Я понимаю, что могу повторить это в Kotlin, но кажется, что язык разработан таким образом, чтобы избежать такой практики.

Обратите внимание на различие между языком без нуля и нулевой безопасный язык.Kotlin является последним, что означает, что он приветствует и охватывает значение null, но, в отличие от языка, такого как Java, ставит его в тупик.

Kotlin предлагает вам синтаксис для краткой обработки обнуляемых типов, читаемый и безопасный способ.Например,

if (account == null){
    openLogin();
}

вы можете использовать эту идиому:

account ?: openLogin()

В другие моменты вы захотите либо действовать на ненулевое значение account, либо просто пропуститьчасть кода, если это null.Тогда вы можете использовать опциональное разграничение ?.:

account?.userName?.also { println("Username is $it") }
0 голосов
/ 05 июня 2018

Я понимаю, что могу повторить это в Kotlin, но кажется, что язык разработан, чтобы избежать практики, подобной этой.

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

val account: UserAccount? = ...

if (account == null){
    openLogin()
} else {
    ...
}

, то компилятор знает, что account не null в ветви else, и он может эффективно иметь необнуляемый тип UserAccount.(Небольшое предостережение: в вашем случае account, скорее всего, будет var, что накладывает некоторые ограничения на умные приведения.)

Как мне поступить в реализации этой системы через Kotlin, еслиЯ добавляю переменную со значением NULL?

Вы не добавляете переменную, вы указываете, что account имеет тип NULL.

Хотя для этого конкретного случая может быть лучше использовать lateinit, в зависимости от ваших требований:

lateinit var account: UserAccount

...
if (!::account.isInitialized) {
    openLogin()
}
0 голосов
/ 05 июня 2018

Вероятно, этот материал может быть полезен: http://www.baeldung.com/kotlin-null-safety

Вы можете искать методы let () и run ().

Метод let ()

Чтобы выполнить действие только тогда, когда ссылка содержит ненулевое значение, мы можем использовать оператор let.

Допустим, у нас есть список значений и есть такжезначение NULL в этом списке:

val firstName = "Tom"
val secondName = "Michael" val names:
List<String?> = listOf(firstName, null, secondName)

Далее мы можем выполнить действие с каждым ненулевым элементом списка имен, используя функцию let:

var res = listOf<String?>() for (item in names) {
     item?.let { res = res.plus(it) } }   
assertEquals(2, res.size)
assertTrue { res.contains(firstName) } 
assertTrue { res.contains(secondName) }

Метод run ()

У Kotlin есть метод run () для выполнения какой-либо операции с нулевой ссылкой.Это очень похоже на let (), но внутри тела функции метод run () работает с этой ссылкой вместо параметра функции:

var res = listOf<String?>()
for (item in names) {
    item?.run{res = res.plus(this)}
}
...