Почему все лучшие программисты не используют «! = null» для пустых суждений?

Java

вопрос

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

...if (someobject != null) {    someobject.doCalc();}...

В итоге в проекте будет много пустого кода, как же это некрасиво и громоздко! Как избежать этой ситуации? Мы злоупотребляем пустотой?

Ответы по сути

Это распространенная проблема, с которой сталкиваются начинающие и программисты среднего уровня. Им всегда нравится возвращать null в методах, поэтому при вызове этих методов они также должны вычислять значение null. Кроме того, возможно, под влиянием этой привычки, они всегда подсознательно считают, что нельзя доверять всем возвратам.

После разглагольствования вернемся к самой теме:

Прежде чем выносить окончательное решение, пожалуйста, различайте следующие две ситуации:

1. null — допустимое и осмысленное возвращаемое значение (где null — допустимый ответ с точки зрения контракта; и)

2. null является недопустимым и неправильным (где это недопустимый ответ).

Вы можете не понять смысл этих двух предложений, не волнуйтесь, продолжайте читать, следующие две ситуации будут подробно рассмотрены

Поговорим о втором случае

null — необоснованный параметр, поэтому он должен явно прерывать программу и выдавать ошибку. Эта ситуация характерна для методов API. Например, если вы разрабатываете интерфейс, id является обязательным параметром, если вызывающая сторона не передает вам этот параметр, конечно, нет. Вы должны быть в курсе этой ситуации и сказать звонящему: «Эй, мужик, что ты делаешь, передавая мне ноль».

По сравнению с оператором null, есть два лучших способа проверить

(1) Assert, вы можете поместить причину ошибки в параметр assert, который не только защищает вашу программу от выхода из строя, но и возвращает причину ошибки вызывающей стороне, что убивает двух зайцев одним выстрелом. (Исходный текст вводит использование утверждения, которое здесь опущено)

(2) Исключения нулевого указателя также могут быть вызваны напрямую. Как упоминалось выше, null в настоящее время является неразумным параметром, если есть проблема, есть проблема, поэтому его следует щедро выкинуть.

Случай 1 немного сложнее

В этом случае null является «на первый взгляд» разумным значением. Например, когда я запрашиваю базу данных при определенном условии запроса, нет соответствующего значения. В настоящее время null считается выражением концепции «пустой».

Вот несколько практических рекомендаций:

1. Если возвращаемый тип метода — коллекции, когда возвращаемый результат пуст, вы можете вернуть пустые коллекции (пустой список) вместо возврата null, чтобы вызывающая сторона могла смело обрабатывать возврат, например, вызывающая сторона получает После возврата вы можете распечатать list.size() напрямую, не беспокоясь о проблеме с нулевым указателем. (Что? Когда я хочу вызвать этот метод, я не помню, был ли метод реализован по этому принципу раньше? Так что навыки кода очень важны! вместо возврата null), когда вы вызываете свой собственный метод, вы можете смело игнорировать null)

2. Что делать, если возвращаемый тип не является коллекциями?

Затем верните пустой объект (не нулевой объект), давайте возьмем «каштан», предполагая следующий код

public interface Action {  void doSomething();} public interface Parser {  Action findAction(String userInput);}

Среди них у Parse есть интерфейс FindAction, который найдет и выполнит соответствующее действие в соответствии с вводом пользователя. Если ввод пользователя неверен, соответствующее действие (Action) может быть не найдено, поэтому findAction вернет null, а затем, когда действие вызовет метод doSomething, появится нулевой указатель.

Один из способов решить эту проблему — использовать шаблон Null Object.

Давайте реконструируем

Класс определяется следующим образом, поэтому после определения метода findAction он гарантирует, что независимо от того, что вводит пользователь, он не вернет нулевой объект.

public class MyParser implements Parser {  private static Action DO_NOTHING = new Action() {    public void doSomething() { /* do nothing */ }  };   public Action findAction(String userInput) {    // ...    if ( /* we can't find any actions */ ) {      return DO_NOTHING;    }  }}

Сравните следующие два примера вызовов

1. Избыточность: каждый раз, когда объект получен, он считается пустым.

Parser parser = ParserFactory.getParser();if (parser == null) {  // now what?  // this would be an example of where null isn't (or shouldn't be) a valid response}Action action = parser.findAction(someInput);if (action == null) {  // do nothing} else {  action.doSomething();}

2. Упростить

ParserFactory.getParser().findAction(someInput).doSomething();

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

Выбранные другие ответы:

1. Если вы хотите использовать метод равенства, используйте object.equal(object))

Например, используя:

"bar".equals(foo)

вместо

foo.equals("bar")

2. В Java8 или guava lib предоставляется необязательный класс, который представляет собой контейнер элементов, который можно использовать для инкапсуляции объектов, чтобы уменьшить допустимость значений NULL. Тем не менее, есть еще много кода. точный.

3. Если вы хотите вернуть null, остановитесь и подумайте, должно ли это место вызывать исключение

наконец

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

Также прошу обратить внимание на мой публичный номер:Программист Офиопогон, Ophiopogon будет каждый день делиться техническими статьями или отраслевой информацией, связанными с java, каждый может следить за статьями и пересылать их!