Есть ли?. оператор для Java, чтобы выполнить проверку нулевого указателя?
Когда я кодирую, я разочарован нулевыми проверками. Особенно при кодировании структур данных!
Я должен сделать это как
String val;
if(a != null && a.child != null)
val = a.child.getValue();
else
val = null;
Что-то вроде этого...
Есть ли такой оператор? (который является частью C#) для Java, чтобы сократить нагрузку?
С # пример:
String val = a?.child?.getValue();
6 ответов
Здесь нет?. оператор в Java, так что, как отмечает Хари, вы должны делать вещи "многословно". Тем не менее, можно утверждать, что это хорошо, так как это препятствует использованию нулей.
Например, в коде OP, почему вы устанавливаете val в null
если или его ребенка там нет? Давайте предположим, что это функция, и val возвращается. Это запах кода: он просто выдвигает требование еще одной нулевой проверки для пользователей вашего кода. Это становится бесконечным циклом нулевых проверок, полностью загромождающих код и вводящих в заблуждение логику, потому что программисты обслуживания часто не могут определить, является ли это законной логикой, или параноидальный бывший программист тихо игнорирует ошибки. Не имитируйте PHP!, Цитирую из этой превосходной напыщенной речи:
"Когда кто-то делает что-то бессмысленное или прерывает работу с ошибкой, он (PHP) будет делать что-то бессмысленное".
PHP делает ужасный выбор дизайна. Гораздо лучше прервать с ошибкой, чем сделать что-то бессмысленное.
Вместо этого вы должны задавать вопросы, такие как:
- Что значит для нуля быть? Это ошибка программирования? Если так, бросьте некоторое RuntimeException / IllegalArgumentException. Если это критический код, и вы "не можете потерпеть неудачу", по крайней мере, запишите, что вы печатаете что-то подозрительное, так что, возможно, это будет исправлено.
- Что если a.child.getValue() сама вернет значение null? Как мой абонент скажет разницу между этим нулем и нулем "a or child is null"? Они не могут.
- Если есть хорошее значение по умолчанию, используйте его. Если вы используете коллекцию или массив, не передавайте null, чтобы означать "пустой". Пройти
Collections.emptyXXX()
например , emptyList или пустой массив. Вместо того, чтобы устанавливать String в null, рассмотрите возможность установки его в пустую строку""
, Кстати, это делает вашhashCode(), equals(), and compareTo()
намного проще! - Используйте шаблон нулевого объекта., Если a является экземпляром Foo, определите статический финальный Foo.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()
много. Напишите небольшую служебную функцию для обработки этого и обработки нулей. Вместо длинных пустых проверок везде, по крайней мере, они заключены в несколько служебных методов. DRY. И, возможно, тот факт, что чеки затянуты долго, побудил вас сделать лучший дизайн. Так что не хватает? Оператор был хорошей вещью, верно?:-)
Нет
Как и с большинством вещей в Java, вы должны делать это многословно. Эй, по крайней мере, это более читабельно - если вам нужно сделать нулевую проверку, почему бы не сделать ее явной и легко видимой (здесь играет адвокат дьявола)
?.
Оператор не существует в Java.
"Самое" компактное, что вы можете сделать, это ?:
троичный оператор, с которым можно "связать":
String val = a != null && a.child != null ? a.child.getValue() : null;
или же
String val = a == null ? null : a.child == null ? null : a.child.getValue();
В Java такого оператора нет.
str != null && str.equals("test")
В Java такого оператора нет. Самая близкая вещь, которую я могу придумать из того, что поддерживает Java, - это условия Yoda, которые позволят вам проверить значение по отношению к такой константе, как
if ("test".equals(str))
вместо
if (str != null && str.equals("test"))
Нет там нет? оператор в JAVA. Вы можете использовать!= Оператор для проверки не нуль
String val = (a != null && a.child !== null) ? a.child.getValue() : null;