Есть ли ?. оператор для Java для проверки нулевого указателя?

Когда я кодирую, я разочарован нулевыми проверками. Особенно при кодировании структур данных!

я должен сделать это как

String val;
if(a != null && a.child != null)
    val = a.child.getValue();
else
    val = null;

Что-то типа этого...

Есть ли такой оператор?. (который является частью C#) для Java, чтобы сократить нагрузку?

С# пример:

String val = a?.child?.getValue();

person Siddharth Kamaria    schedule 22.11.2014    source источник
comment
часто считают, но нет.   -  person MeBigFatGuy    schedule 22.11.2014
comment
Вы имеете в виду троичную операцию? String val = (a != null && a.child != null) ? a.child.getValue() : null;   -  person Dioxin    schedule 22.11.2014
comment
нет, он имеет в виду оператора Элвиса?:   -  person MeBigFatGuy    schedule 22.11.2014
comment
@VinceEmigh Нет, я прошу оператор проверки нуля ... Мы делаем это на C # как String val = a?.child?.getValue();   -  person Siddharth Kamaria    schedule 22.11.2014
comment
Если это происходит часто, чтобы вас расстроить, используйте меньше нулей в своем коде. Подобно шаблону Null Object   -  person user949300    schedule 22.11.2014
comment
@user949300 user949300 Мне нравится ваша идея использования шаблона нулевого объекта. Но если есть несколько нулевых проверок, тогда лучше будет оператор if! В моем случае я могу использовать его при кодировании структур данных, так как это происходит несколько раз. Почему бы не выдвинуть эту идею в качестве ответа?   -  person Siddharth Kamaria    schedule 22.11.2014
comment
@sidkarmaria Готово. Опубликован новый ответ.   -  person user949300    schedule 22.11.2014


Ответы (6)


Здесь нет ?. оператор в Java, поэтому, как отмечает Хари, вам придется делать что-то «долгоиграющим». Однако можно возразить, что это хорошо, поскольку не рекомендуется использовать пустые значения.

Например, в коде OP, почему вы устанавливаете val на null, если a или его дочерний элемент отсутствует? Предположим, что это функция, и val возвращается. Это запах кода: он просто навязывает пользователям вашего кода необходимость еще одной проверки на null. Это превращается в бесконечный цикл проверок на null, полностью загромождающий код и запутывающий логику, потому что программисты, обслуживающие часто не может сказать, является ли это законной логикой, или бывший программист-параноик спокойно игнорирует ошибки. Не копируйте PHP!< /сильный>. Цитата из этой прекрасной тирады:

«Когда вы сталкиваетесь с чем-то бессмысленным или прерываете работу с ошибкой, он (PHP) сделает что-то бессмысленное».

PHP делает ужасный выбор дизайна. Гораздо лучше прервать с ошибкой, чем сделать что-то бессмысленное.

Вместо этого вы должны задавать такие вопросы, как:

  1. Что значит быть нулевым? Это ошибка программирования? Если это так, сгенерируйте исключение RuntimeException/IllegalArgumentException. Если это критический код, и вы «не можете ошибиться», по крайней мере, запишите, что вы скрываете что-то подозрительное, так что, возможно, это будет исправлено.
  2. Что, если сам a.child.getValue() возвращает null? Как мой вызывающий абонент определит разницу между этим null и нулевым значением «a или child is null»? Они не могут.
  3. Если есть хорошее значение по умолчанию, используйте его. Если вы используете коллекцию или массив, не передавайте null в значение "пустой". Передайте Collections.emptyXXX(), например. пустой список или пустой массив. Вместо того, чтобы устанавливать для строки значение null, рассмотрите возможность установки для нее пустой строки "". Кстати, это делает ваш hashCode(), equals(), and compareTo() намного проще!
  4. Используйте Шаблон пустых объектов. Если a является экземпляром Foo, определите static final Foo.NULL, у которого есть дочерний элемент, значение которого само является чем-то "нулевым" - либо null, либо "".

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

/**
   countPeople
   @param  node  null means the foobar can't connect to the database, 
   @return       Foobar.ERR_NO_DB if node is null
*/

В примере OP это выглядит как какой-то узел XML, а интерфейсы Java XML огромны, и создание хорошего объекта NULL для одного из них было бы огромной задачей. (Хм, может быть, хороший небольшой проект с открытым исходным кодом?). Однако в этом случае вы, вероятно, будете часто звонить a.child.getValue(). Напишите небольшую служебную функцию, чтобы справиться с этим и обработать нули. Вместо многословных проверок null, по крайней мере, они инкапсулированы в несколько служебных методов. СУХОЙ. И, возможно, тот факт, что чеки длинные, побудил вас сделать лучший дизайн. Итак, отсутствие ?. оператор был хорошей вещью, не так ли? :-)

person user949300    schedule 22.11.2014

No

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

person Hari Menon    schedule 22.11.2014
comment
В случае, если это неясно из ответа: пример C# делает проверку нуля явной, она легко видима, а код определенно более читабелен. - person Karoly Horvath; 27.11.2014
comment
Я буду голосовать за С#. Но +1 все равно за техническую точность. - person Shaul Behr; 27.05.2020

Оператор ?. не существует в Java.

«Самое» компактное, что вы можете сделать, это тернарный оператор ?:, который вы можете «сцепить»:

String val = a != null && a.child != null ? a.child.getValue() : null;

or

String val = a == null ? null : a.child == null ? null : a.child.getValue();
person icza    schedule 22.11.2014
comment
То, что я делал... либо я использую операторы if, либо тернарный оператор. В любом случае спасибо :) - person Siddharth Kamaria; 22.11.2014

В Java такого оператора нет. Самое близкое, что я могу придумать, что поддерживает Java, это условия Yoda, которые позволят вам проверить для значения против константы, например

if ("test".equals(str))

вместо

if (str != null && str.equals("test"))
person Elliott Frisch    schedule 22.11.2014
comment
Что, если мы не знаем тестовую строку? - person Siddharth Kamaria; 22.11.2014
comment
@sidkamaria Если вы не знаете тест String, вы не можете использовать условия Йоды. - person Elliott Frisch; 22.11.2014
comment
Мне это как-то не выгодно. В любом случае узнал кое-что новое :) - person Siddharth Kamaria; 22.11.2014

Нет нет ?. оператор в JAVA. Вы можете использовать оператор != для проверки ненулевого значения

String val = (a != null && a.child !== null) ? a.child.getValue() : null; 
person S. M. Mohiuddin    schedule 22.11.2014

В Java такого оператора нет.

 str != null && str.equals("test")
person Syed Mohammad Shakil    schedule 06.05.2018