Как избежать написания кода типа "XXX!= Null" или "XXX!= Null || XXX.isEmpty"

Я пишу коды, которые запрашивают базу данных для получения данных. Есть несколько классов, которые состоят из List s, но иногда список или другой атрибут не может быть инициирован, а их значение null, поэтому мне нужно написать list!=null || list.isEmpty или attribute != null, прежде чем я смогу использовать атрибут.

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

public class SpotVo {
    private Double avg;

    private String brief;

    private ArrayList<HotelVo> hotels;

    private int id;

    private ArrayList<byte[]> images;

    private AddressVo location;

    private String name;

    private ArrayList<RestaurantVo> restaurants;
}

Как вы можете видеть, в этом классе есть несколько списков и других атрибутов, все может быть null или пустым, могу ли я сделать что-то, чтобы этого избежать?

Ответ 1

Ответ зависит от того, имеет ли null особое значение. Например, для поля String ваше приложение должно различать null и ""? Для Collection -значного поля нужно различать null и пустой объект коллекции?

Если ответ "нет", вы можете записать классы "объект данных", чтобы нормализовать нули до соответствующих значений "в полосе". Вы можете сделать это в геттерах или сеттерах или конструкторах, в зависимости от того, как объекты материализуются из базы данных.

Несколько других вещей, которые вы можете сделать, это:

  • Измените схему базы данных, чтобы соответствующие столбцы не были нулевыми.

  • Если вы используете ORM или механизм привязки данных, попробуйте настроить это (через аннотации или что-то еще) для использования значений "в полосе" вместо null.

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

Короче говоря, если вы систематически вычеркиваете значения null, вам не нужно тестировать их в бизнес-логике.


Обратите внимание, что этот подход не всегда работает. Случай, который меня раздражает, - это выбор параметров из объекта HTTPRequest в сервлете:

  • Приложение может иметь дело с 4 различными случаями:

    • параметр отсутствует

    • параметр без значения/пустое значение

    • присутствует с непустым значением

    • присутствует несколько раз.

  • Параметры извлекаются из стандартного API, а не из специального класса, который может быть выполнен для нормализации значений в соответствии с требованиями webapp.

Ответ 2

Вы можете написать функцию, которая проверяет, является ли объект null и/или если это строка, это "". Затем просто вызывайте эту функцию каждый раз, когда вам нужно будет проверить все условия. Заставьте его возвращать логическое значение, чтобы вы могли просто вставить его в операторы if.

boolean check(Object o)
{
    if (o != null)
        {
            if (o instanceof String)
            {
                if (((String) o).equals(""))
                    return false;
            }
            return true;
        }
        return false;
}

Обратитесь к предложению rcook в комментариях для лучшей реализации этого.

Ответ 3

Самый простой способ решить это - CollectionUtils.isEmpty.

Возвращает: true, если пусто или null

Таким образом вы можете сделать это в одной строке.

Когда дело доходит до "атрибутов", существуют шаблоны проектирования, которые могут помочь в этом. Или вы можете использовать класс Guava Optional. Подробнее об этом можно прочитать здесь: В чем смысл дополнительного класса Guava

Ответ 4

Я думаю, что здесь есть две проблемы: Во-первых, вы должны проверить значения null, которые я абсолютно согласен, глупо. Проблема в том, что null является родным для языка Java, поэтому единственный способ сделать его немного лучше - использовать такие методы, как те, которые были упомянуты Стивом P и tieTYT. Существует, однако, другой способ борьбы с null, никогда не используя его. Конечно, вы не можете полностью избежать этого, но, по крайней мере, в своем коде вы должны устранить все null -references. Для этого есть несколько замечательных аргументов, которые я не буду здесь останавливать, но вы можете прочитать Избегание!= Null операторов для более подробной информации.

Если вам интересен Java-язык, Scala, он хорошо развился, реализовав класс Option, который может определить, существует или нет значение (равное значению null). Хорошее сообщение в блоге об этом здесь: http://jim-mcbeath.blogspot.fr/2008/10/avoiding-nulls.html

Имея (в основном) убрав нулевую проблему, следующей проблемой будет проверка на isEmpty или подобное при использовании коллекций. Это, как вы говорите, боль в заднице. Но я действительно обнаружил, что эти проверки можно в значительной степени избежать. Все зависит от того, что вам нужно делать с вашей коллекцией, но в большинстве случаев коллекции используются для прохождения или манипуляции каким-то образом. Использование foreach-loop в Java гарантирует, что ничего не будет выполнено, если в коллекции ничего нет. Ухоженная.

Есть случаи, когда коллекция не должна быть пустой. Некоторые из них можно избежать, хотя, имея хороший дизайн (например, тот, который позволяет пустые списки, гарантирует, что список не пуст и т.д.), Но для остальных их просто нет. Когда-либо. Но, исключив нулевые проверки, вызывать несколько isEmpty сейчас и не так уж плохо: -)

Надеюсь, что это помогло.