Подтвердить что ты не робот

Каков правильный способ использования метода .equals в Java?

Я разговаривал с моим профессором CompSci, и он предложил, чтобы все методы String .equals записывались как:

"Hello World".equals(fooString);

а не:

fooString.equals("Hello World");

Обе эти строки компилируются, но мне было интересно, какие преимущества имеют первый способ? Я всегда делал это последним способом. Это неправильно? Что общего/обычного?

4b9b3361

Ответ 1

Первый способ гарантирует, что при выполнении сравнения вы не получите NullPointerException. Это исключение вызывается (возникает) при попытке вызвать метод для объекта, который не существует.

Некоторое релевантное касание ниже: Прослушивание при собственном риске

В качестве примечания, однако, я очень, очень редко видел этот метод или стиль кодирования, используемый в законной производственной среде. Для этого есть две причины.

Во-первых, программы, которые вы пишете, почти всегда хотят делать что-то особенное или другое в случае, если ваша переменная содержит null. Это связано с тем, что обычно это указывает на ошибку в какой-либо другой части функции кода или на специальный случай, который необходимо решить. Таким образом, проверка нулей всегда должна происходить до любых сравнений или вызовов метода над объектом (в этом случае ваш String fooString).

Во-вторых, fooString.equals("Hello World") просто делает ваш код немного читабельнее. Логическое значение первого метода в вашем коде занимает несколько секунд, чтобы обрабатывать правильно, и легко сделать ошибку суждения, когда вы просматриваете сотни или тысячи строк кода. Это на самом деле гораздо менее тривиально, чем кажется, потому что в рабочем мире, чаще всего, есть очень большие и очень старые программы, которые будут исправлены людьми, которые ничего не знали о них, прежде чем взглянуть на них, чтобы решить проблему. Читаемость кода вносит огромный вклад в способность компании быстро выполнять сортировку и решать долгосрочные проблемы.

Ответ 2

Первый способ гарантирует, что NullPointerException никогда не бросается, а второй может получить NullPointerException, если fooString окажется null.

Однако, в конце концов, все это сводится к требованию. Если требование указывает, что случай null не должен происходить вообще или должен обрабатываться по-разному, то запись на втором пути (fooString.equals()) помогает обнаружить дефект реализации. Если вы можете рассматривать null как просто еще один случай, то 1-й способ в порядке.