Как установить значение ненулевой строковой переменной пустым, если передано нулевое значение - PullRequest
0 голосов
/ 23 апреля 2019

Как мне получить аналог этого Java-кода в Kotlin?

class Item {
    private String text = "";

    public String getText() {
        return text;
    }

    public void setText(String str) {
        if(str == null){
            text = "";
        } else {
            text = str;
        }
    }

}

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

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

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

На самом деле это не идиоматический эквивалент Котлина.Прямой перевод будет выглядеть так:

class Item {
    var text: String = ""
        set(value) { field = value ?: "" }
}

Это объявляет необнуляемое свойство со значением по умолчанию.(Как и все свойства Kotlin, его поле является закрытым; у него также есть метод getter и - потому что это var - метод setter, оба из которых являются публичными, потому что никакой другой видимости не было указано.) И он переопределяет setter кзамените значение по умолчанию, если передано null.

Если вызывается из кода Java, то я думаю, выше, будет обрабатывать его, как ожидалось.(Я не проверял это.)

Но поскольку компилятор Kotlin знает, что поле не имеет значения NULL, он не позволил бы вам вызвать метод установки с нулевым значением в первую очередь;в этом его отличие от версии Java.

Так что, если бы он вызывался только из другого кода Kotlin, ?: "" никогда бы не использовался, и поэтому установщик не должен был бы быть переопределен.Самый естественный перевод на Kotlin был бы просто:

class Item {
    var text: String = ""
}
0 голосов
/ 23 апреля 2019
class Item {
    private var text: String = ""

    fun getText() = text

    fun setText(str: String?) {
        text = str ?: ""
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...