Подсветка, когда оператор равенства (==) используется для сравнения строк в Eclipse - PullRequest
10 голосов
/ 13 июля 2010

Можно ли как-нибудь заставить Eclipse выделить использование оператора == для проверки равенства строк? Я продолжаю ошибочно использовать его вместо того, чтобы звонить .equals().

Я бы действительно хотел превратить это в предупреждение и потребовать аннотацию @SuppressWarnings, чтобы удалить его, в случае, когда это еще не произошло, что я действительно хочу сравнить строки на предмет равенства объектов.

Могу ли я использовать какие-либо инструменты, чтобы помочь избавиться от этой вредной привычки во время редактирования?

Ответы [ 3 ]

11 голосов
/ 13 июля 2010

Используйте инструмент статического анализа , такой как FindBugs , PMD или CheckStyle .

Есть Eclipseплагины для каждого, а также задачи Ant, плагины Maven и т. д.

Каждый из них имеет правила, относящиеся к равенству строк ( правило Findbugs , правило PMD , Правило проверки стиля ).

5 голосов
/ 13 июля 2010

Очевидный ответ на вопрос уже дан , но здесь есть предупреждение, которое не является прямым ответом: obj.equals также может дать сбой, если obj равно нулю.Поэтому вам часто приходится использовать код, подобный следующему:

if(mystr1 != null && mystr1.equals(mystr2))

, потому что это

if(mystr1.equals(mystr2))

завершится с ошибкой NullPointerException, если mystr1 будет нулевым.

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

if("ABCDEF".equals(mystr1))

вместо

if(mystr1.equals("ABCDEF"))

По этой причине многие библиотеки (например, apachecommons / lang ) предоставляет служебные функции, которые объединяют эти проверки:

// this is the definition of org.apache.commons.lang.StringUtils.equals(String, String)
public static boolean equals(String str1, String str2) {
    return str1 == null ? str2 == null : str1.equals(str2);
}

// this is the definition of  org.apache.commons.lang.ObjectUtils.equals(Object, Object)
public static boolean equals(Object object1, Object object2) {
    if (object1 == object2) {
        return true;
    }
    if ((object1 == null) || (object2 == null)) {
        return false;
    }
    return object1.equals(object2);
}

Использование этих методов обычно безопаснее, чем равные, если только вы точно не знаете, что один из двух объектов не равен нулю

1 голос
/ 21 ноября 2013

Я не согласен с предыдущими ответами - это ошибка в затмении, и вы можете проголосовать за нее здесь: https://bugs.eclipse.org/bugs/show_bug.cgi?id=39095.

Затмение может очень хорошо предупредить , когда вы сравниваете строки с == так как это редко то, что вы хотели (или то, что хотел оригинальный автор).

...