Как вернуть логическое значение из функции в Kotlin - PullRequest
1 голос
/ 15 марта 2019

Я новичок в котлине. Я читаю ключ и значение из файла свойств в программе kotlin. Но я не знаю, как напрямую вернуть значение ключа. Пожалуйста, найдите application.yml и abc.class (это класс kotlin) ниже.

application.yml

abcconfig:
  isabcEnabled:
    default: false
    xyz: true
    def: true

abc.class

import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.stereotype.Component

@Component
@ConfigurationProperties(prefix = "abcconfig")
class AbcConfig {

    private var abcEnabled: Map<String, Boolean> = mutableMapOf()

    fun getabcEnabledValue(siteId: String?): Boolean {

        val abc: Boolean
        val key: String? = if (abcEnabled.containsKey(key)) key else "default"

        abc = abcEnabled[key]
        return abc
    }

    fun setAbcEnabled(abcEnabled: Map<String, Boolean>) {
        this.abcEnabled = abcEnabled
    }

}

1 Ответ

3 голосов
/ 15 марта 2019

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

Код в этом вопросе имеет одну конкретную проблему обнуляемости.(Он также имеет некоторую путаницу, включая две ссылки на key до того, как он будет установлен. Я предполагаю, что они должны быть siteId.)

Проблема в том, что происходит, когда карта abcEnabled несодержать запрошенный ключ.Если ключ присутствует, то оператор […] вернет соответствующее значение Boolean;но если ключ отсутствует (что может произойти, если карта не содержит ключ «по умолчанию»), он возвращает ноль.Однако переменная, которую вы пытаетесь присвоить, имеет тип Boolean, что не допускает нулевые значения.Вот почему компилятор жалуется.

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

Если вы хотите вернуть false в этом случае, код может сводиться к:

fun getabcEnabledValue(siteId: String?): Boolean {
    val key: String? = if (abcEnabled.containsKey(siteId)) siteId else "default"
    return abcEnabled[key] ?: false
}

или даже (для лучшегобезопасность, а также краткость и ясность):

fun getabcEnabledValue(siteId: String?)
    = abcEnabled[siteId] ?: abcEnabled["default"] ?: false

Или, если вы хотите вернуть null в этом случае, просто объявите функцию как возвращающую Boolean? (которая допускает нулевое значение) - или пропустите?: false в последнем примере.

(Кроме того, из соображений стиля я не уверен, почему вы сделали abcEnabled частным свойством, а затем добавили свой собственный установщик. Действительно ли это необходимо?скрыть получатель? Если нет, то публичное свойство будет проще. И, вероятно, стоит сделать заглавными буквы abc в именах методов.)

...