Почему неизменный нуль не рекомендуется?
В настоящее время я использую библиотеку 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
Статья по пари на эту тему, которую я видел / читал на сегодняшний день, является объяснением Гуавы.