views:

86

answers:

2

Is there any way I can get Eclipse to highlight the use of the == operator to test String equality? I keep mistakenly using it instead of calling .equals().

I'd really like to make that into a warning and require an @SuppressWarnings annotation to remove it, in the yet-to-happen case that I actually want to compare strings for object equality.

Are there any tools can I use to help break this bad habit at edit-time?

+8  A: 

Use a static analysis tool such as FindBugs, PMD, or CheckStyle.

There are Eclipse plugins for each, along with Ant tasks, Maven plugins, etc.

Each of these has rules relating to String equality (Findbugs rule, PMD rule, Checkstyle rule).

matt b
I'd definitely second the use of Findbugs for Eclipse.... has been a godsend for catching these little kind of coding issues!
mikera
all of these are great, especially when used together on a continuous integration server like hudson (provided that people actually look at the results :-) )
seanizer
do you know if any of them run at edit-time? we're already running a couple of these as part of nightly builds, and generating report files. i want something that does the error/warning highlighting right as i type.
Tom Tresansky
@Tom Tresansky, yes the PMD/Findbugs/Checkstyle plugins can be configured to scan your code on each build, and if Eclipse is compiling your code on each save, then you will get new warnings generated at edit-time.
matt b
+3  A: 

The obvious answer to the question has already been given, but here is a warning that is not a direct answer: obj.equals can also fail if obj is null. So you'll often have to use code like this:

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

because this

if(mystr1.equals(mystr2))

would fail with a NullPointerException if mystr1 is null.

Which is why, when the comparison string is a known constant, the following syntax is often used:

if("ABCDEF".equals(mystr1))

rather than

if(mystr1.equals("ABCDEF"))

For this reason, many libraries (like apache commons / lang ) provide utility functions that combine these checks:

// 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);
}

Using these methods is usually safer than plain equals, unless you know for sure that one of the two objects is not null

seanizer