Почему неизменный нуль не рекомендуется?

В настоящее время я использую библиотеку Immutable для создания объекта JSON из моего веб-приложения.

Глядя на эту главу, первая строка говорит:

Использование обнуляемых атрибутов не рекомендуется.

Итак, мой вопрос:

1) почему? что не так с нулевым объектом?

2) что, если я использую обертку третьего объекта, и я не знаю, является ли элемент пустым или нет, поэтому использование кода построителя классификации не удастся:

MyImmutableWrapperObject
    .builder().
    .mobile(input.getMobile()) // don't know if null or not
    .build();

Есть ли оптимальное решение?

РЕДАКТИРОВАТЬ:

@JsonProperty("mobile")
public abstract Optional<String> mobile();  

...

// composing builder
if (input.getMobile() != null)
        builder.mobile(input.getMobile());

Полученный JSON это:

"mobile": {
    "present": false
},

Как я могу полностью удалить пустые поля?

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

POSTEDIT:

Я только что обнаружил, что Optional не показывает реальное значение, даже если оно присутствует, но просто отображает значение true / false, поэтому оно мне не нужно.

1 ответ

Решение

В этом и заключается смысл IMO, вы не знаете, является ли объект нулевым или нет; поэтому при последующем использовании вы можете получить NullPointerException, Используя библиотеку, которая запрещает это, вы не будете беспокоиться, если что-то равно нулю или не равно нулю (потому что оно не будет равно нулю), следовательно, меньше кода и меньше if- заявления, которые загрязняют код потенциальными нулевыми проверками.

Также наличие нулевой ссылки может означать разные вещи в разных контекстах. Например, я видел код, который нуждается в трех состояниях для Boolean: true, false и еще не установлено (как null). Я нахожу это неправильным, но все еще иногда вижу это.

Вот почему Optional был введен в Гуаве и сейчас находится в JDK. Это заставляет пользователя активно что-то делать с Optional, Например:

  Optional<Integer> i...

  if(i.isPresent()).... // you are forced to do this check

Ну, очевидно, вы могли бы сделать:

 i.get()

но этот метод задокументирован, что он может сломаться.

то же самое просто не верно для справки:

 Integer i  = null;
 if(i == null) // this is not an operation that is mandatory

Статья по пари на эту тему, которую я видел / читал на сегодняшний день, является объяснением Гуавы.

Другие вопросы по тегам