Какова стоимость теста! "". Equals (someString) - PullRequest
1 голос
/ 17 марта 2011

В проекте, с которым я пытался ознакомиться, я столкнулся с методом, который выглядит следующим образом:

public boolean testString(String string){
    return string != null && !"".equals(string);
}

Какова ценность проверки строки на пустоту таким образом, а не с помощью переменной сначала? Я понимаю, почему мы видим константу-сначала (синтаксис Yoda) в C, но есть ли причина делать это с вызовами методов в Java?

примечание: я понимаю о NullPointerException, что в данном случае невозможно. Я ищу ценность, чтобы делать это таким образом, особенно в этом случае.

Ответы [ 9 ]

4 голосов
/ 17 марта 2011

В этом контексте это не имеет большого значения, так как он уже проверен на ноль.Обычно вы делаете это таким образом, чтобы убедиться, что вы не вызываете элемент с нулевой ссылкой (что приводит к NullPointerException), то есть

"test".equals(myString)

никогда не вызовет исключение нулевого указателя, тогда как

myString.equals("test")

будет, если myString равен нулю.Итак, в основном, первый тест проверяет, что это строка (не ноль) И она равна «test».

1 голос
/ 18 марта 2011

Для двух строк это не имеет большого значения, но когда задействован не final тип, это может быть микрооптимизацией.

Если левая сторона не является переопределенным бетонным типом, то отправка становится статической.

Рассмотрим, что JIT должен сделать для

Object o;
String s;

o.equals(s)

против

* * 1010

В первом JIT должен найти фактический используемый метод equals, тогда как во втором он знает, что может только на String.equals.

Я принял привычку делать

"constant value" == variableName

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

1 голос
/ 17 марта 2011

Обычная причина использования "constant string".equals(variable) заключается в том, что это работает правильно, даже если variable равно null (в отличие от variable.equals("constant string")). В вашем случае, однако, поскольку вы проверяете string != null в логическом тесте на короткое замыкание, это полностью вопрос стиля (или привычки).

0 голосов
/ 18 марта 2011

На этот вопрос можно ответить на нескольких уровнях:

  1. Что означает пример?

    Как объяснили другие ответы, !"".equals(str) проверяет, является ли str непустой строкой.В общем, идиома <stringLiteral>.equals(str) - это аккуратный способ проверки строки, которая работает с нулевым регистром без явного теста.(Если str равно null, то выражение оценивается как false.

  2. Является ли этот конкретный пример наилучшей практикой?

    В общем, №. !"".equals(str) part относится к случаю, когда str равен нулю, поэтому предыдущий нулевой тест является избыточным.

    Однако, если str был равен нулю в подавляющем большинстве случаев , это использованиевозможно, будет быстрее.

  3. Какой лучший способ сделать это с точки зрения стиля кода?

    return "".equals(str);

    или

    return str != null && !str.isEmpty();

    Однако второй подход не работает с версиями Java до 1.6 ..., поскольку isEmpty() является недавним расширением API.

  4. Каков оптимальный способ сделать это?

    Мне кажется, что return str != null && !str.isEmpty(); будет самым быстрым. String.isEmpty() метод реализован как однострочный тест и достаточно мал, чтобыJIT-компилятор встроит его. Метод String.equals(Object) намного сложнее и слишком велик, чтобы его можно было встроить.

0 голосов
/ 18 марта 2011

Нет, это неестественно и труднее читать. Это вызывает паузу для большинства читателей и может расточительно расходовать много ресурсов на stackoverlow.com.

(лучше использовать string.isEmtpy() в любом случае)

Нет фиксированных правил, иногда это легче читать

if( null != foobar(blahblahblah, blahblahblah, blahblahblah) )

чем

* * 1010
0 голосов
/ 18 марта 2011

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

public boolean testString(String string){
    return !"".equals(string);
}

, в то время как эта может выдать исключение времени выполнения, если строка равна нулю

public boolean testString(String string){
    return !string.equals("");
}
0 голосов
/ 17 марта 2011

Мишко Хевери (см. Его видео на YouTube) называет этот тип избыточного убийства "параноидальным программированием": -)

Вероятно, в этом видео: http://www.youtube.com/watch?v=wEhu57pih5w

Смотрите также здесь: http://misko.hevery.com/2009/02/09/to-assert-or-not-to-assert/

0 голосов
/ 17 марта 2011

Запускаются ли какие-либо инструменты, такие как checkstyle?если это так, то если поставить переменную первым, произойдет сбой контрольного стиля.Другая причина заключается в том, что если вы сначала поместите пустую строку, это исключит возможность получения исключения NULL, если переменная равна NULL, поскольку выражение всегда будет иметь значение falseЕсли у вас сначала была переменная, а переменная была нулевой, то возникнет исключение.

0 голосов
/ 17 марта 2011

Если они только что сделали это:

!"".equals(string);

, тогда они избегают возможности исключения NullPointerException, которое довольно умно.Тем не менее, они проверяют нулевое значение прямо перед этим условием, что технически не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...