2010-07-13 3 views
9

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

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

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

ответ

10

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

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

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

+1

Я бы предпочел использовать Findbugs для Eclipse .... был удачей для того, чтобы поймать эти маленькие проблемы с кодированием! – mikera

+1

все это замечательно, особенно при совместном использовании на сервере непрерывной интеграции, таком как hudson (при условии, что люди действительно смотрят на результаты :-)) –

+1

знаете ли вы, что любой из них запускается во время редактирования? мы уже запускаем пару из них как часть ночных сборок и создаем файлы отчетов. я хочу что-то, что делает подсветку ошибки/предупреждения, как только я набираю. –

5

Очевидный ответ на вопрос has already been given, но вот предупреждение, которое не является прямым ответом: obj.equals также может потерпеть неудачу, если obj равно null. Таким образом, вы будете часто использовать такой код:

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

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

if(mystr1.equals(mystr2)) 

потерпит неудачу с NullPointerException, если mystr1 равна нулю.

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

if("ABCDEF".equals(mystr1)) 

вместо

if(mystr1.equals("ABCDEF")) 

По этой причине, многие библиотеки (например, apache commons/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

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

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

Смежные вопросы