Как установить нулевое значение, если строка пуста? - PullRequest
0 голосов
/ 30 января 2019

Иногда разработчики проверяют, являются ли строки значениями null , если да, устанавливает эти строки как пустое значение:

if (text == null) {
    text = "";
}

Что я хочу сделать, этонапишите напротив if выражение:

if (text.isEmpty()) {
    text = null;
}

Но ... прежде всего - я должен проверить (как обычно), является ли эта строка нулевой, чтобы избежать исключения NullPointerException, поэтому сейчас она выглядитвот так (очень уродливо, но ПОЦЕЛУЙ):

if (!text == null) {
    if (text.isEmpty()) {
        text = null;
    }
}

В моем классе есть несколько полей String, и для всех них мне нужно подготовить это решение.Какие-нибудь основные идеи для более эффективного кода?Это хороший способ растянуть его до лямбда-выражений и перебрать все строковые поля в этом классе?

Ответы [ 6 ]

0 голосов
/ 31 июля 2019

Другая альтернатива, использующая Guava's emptyToNull :

text = Strings.emptyToNull(text);
0 голосов
/ 30 января 2019

У меня нет лучшего ответа на вашу проблему, чем тот, который уже был опубликован.Тем не менее, я бы сильно спросил, почему вы хотите объединить пустые строки и нули в нули.Нули - вообще плохая идея, "ошибка в миллиард долларов", чтобы процитировать Тони Хоара, который сам придумал нулевые ссылки. В этом сообщении в блоге есть несколько хороших аргументов!

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

Еще лучше взгляните на тип Optional, который представляет объект, который может присутствовать или не присутствовать.Это появилось в Java 8 как лучший способ представить отсутствие, чем нули.Вот сообщение в блоге , которое объясняет это.

0 голосов
/ 30 января 2019

В вашем примере, если текст равен нулю, тогда text.equals (null) вызовет NPE.Вам понадобится что-то вроде этого:

if (text != null && text.isEmpty()) {
    text = null;
}

Если вы хотите, чтобы пробелы также считались пустыми, вам нужно будет вызвать trim () перед вызовом isEmpty ():

if (text != null && text.trim().isEmpty()) {
    text = null;
}

Так как выЕсли вы хотите повторно использовать этот код, имеет смысл сделать этот метод утилитой, который можно вызывать из любого класса:

public static String setNullOnEmpty(final String text) {
    return text != null && text.trim().isEmpty() ? null : text;
}
0 голосов
/ 30 января 2019

Не используйте equals(), чтобы проверить, является ли строка null, но:

if (text == null)

Итак

if (text != null && text.isEmpty()) {
    text = null;
}

Это условие 1 строки не будет бросать NPEесли text равно null из-за оценки короткого замыкания.

0 голосов
/ 30 января 2019

Вы можете сделать то же самое, используя оператор if, как показано ниже,

    if (text != null && text.isEmpty()) {
        text = null;
    }
0 голосов
/ 30 января 2019

Я не знаю, в каком контексте вы упомянули потоки, относящиеся к вашему вопросу, но если вы открыты для библиотеки Apache StringUtils, тогда одним из вариантов будет использование метода StringUtils#isEmpty():

if (StringUtils.isEmpty(text)) {
    text = null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...