Какова правильная позиция литералов при сравнении строк?


У меня есть

if (localName.equals("TaxName")) {

Но PMD говорит

Position literals first in String comparisons
5 8
pmd

5 ответов:

"TaxName".equals(localName) лучше, если localName равно null, вы не получите исключение null-указателя.

PMD также должен сообщить вам , Почему он генерирует это предупреждение. Из документации по правилам на веб-сайте PMD:

Сначала расположите литералы в строковых сравнениях - таким образом, если строка равна null, вы не получите исключение NullPointerException, оно просто вернет false.

Я предпочитаю сначала расположить литералы, т. е.:

if ("TaxName".equals(localName)) { ...

Таким образом, Вы делаете правильное сравнение для случая null, вместо получения NullPointerException.

Лично, это не имеет смысла для меня. Если код ловит исключение NullPointerException, то это проделанная работа, которую вам не придется делать позже. Если localName в конечном итоге становится null, и это вызывает проблему позже, то его будет сложнее отследить. Не меняйте код, чтобы сделать компилятор счастливым. Если ваш код вызывает исключение NullPointerException, то это сэкономит вам время отладки позже.

Чтобы избежать этого предупреждения, более простым решением является проверка nullpointers before, которая рекомендуется в каждом объекте, которым мы управляем, а не только в этом случае:

if (localName!=null && localName.equals("TaxName")) {
    ...
}