Здесь нет ?. оператор в Java, поэтому, как отмечает Хари, вам придется делать что-то «долгоиграющим». Однако можно возразить, что это хорошо, поскольку не рекомендуется использовать пустые значения.
Например, в коде OP, почему вы устанавливаете val на null
, если a или его дочерний элемент отсутствует? Предположим, что это функция, и val возвращается. Это запах кода: он просто навязывает пользователям вашего кода необходимость еще одной проверки на null. Это превращается в бесконечный цикл проверок на null, полностью загромождающий код и запутывающий логику, потому что программисты, обслуживающие часто не может сказать, является ли это законной логикой, или бывший программист-параноик спокойно игнорирует ошибки. Не копируйте PHP!< /сильный>а>. Цитата из этой прекрасной тирады:
«Когда вы сталкиваетесь с чем-то бессмысленным или прерываете работу с ошибкой, он (PHP) сделает что-то бессмысленное».
PHP делает ужасный выбор дизайна. Гораздо лучше прервать с ошибкой, чем сделать что-то бессмысленное.
Вместо этого вы должны задавать такие вопросы, как:
- Что значит быть нулевым? Это ошибка программирования? Если это так, сгенерируйте исключение RuntimeException/IllegalArgumentException. Если это критический код, и вы «не можете ошибиться», по крайней мере, запишите, что вы скрываете что-то подозрительное, так что, возможно, это будет исправлено.
- Что, если сам a.child.getValue() возвращает null? Как мой вызывающий абонент определит разницу между этим null и нулевым значением «a или child is null»? Они не могут.
- Если есть хорошее значение по умолчанию, используйте его. Если вы используете коллекцию или массив, не передавайте null в значение "пустой". Передайте
Collections.emptyXXX()
, например. пустой список или пустой массив. Вместо того, чтобы устанавливать для строки значение null, рассмотрите возможность установки для нее пустой строки ""
. Кстати, это делает ваш hashCode(), equals(), and compareTo()
намного проще!
- Используйте Шаблон пустых объектов. Если 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
String val = (a != null && a.child != null) ? a.child.getValue() : null;
- person Dioxin   schedule 22.11.2014