That's why I move to Scala, == means what it should be:)
Thanks for the sharing.

> -----Original Message-----
> From: Trippie [mailto:trip...@gmail.com] On Behalf Of Hugo Trippaers
> Sent: Tuesday, February 25, 2014 5:41 AM
> To: <dev@cloudstack.apache.org>
> Subject: Anti-patterns
> 
> Anti-pattern:
> An anti-pattern (or antipattern) is a common response to a recurring problem
> that is usually ineffective and risks being highly counterproductive. The 
> term,
> coined in 1995 by Andrew Koenig, was inspired by a book, Design Patterns, in
> which the authors highlighted a number of design patterns in software
> development that they considered to be highly reliable and effective.
> - source http://en.wikipedia.org/wiki/Anti-pattern
> 
> 
> Here at Schuberg we spend quite some time going through bugs reports
> from automated scanners, you have probably seen the mails coming by on
> the ML. As part of our work we have encountered a number of problems
> that keep on popping up in the code base. So here is my first attempt to
> clarify why a certain pattern is wrong and hopefully help developers to avoid
> this.
> 
> So first up is the equality operator, ==.  This operator is commonly used in
> many languages to compare if two items are equal. The trick with this
> operator in java is to know exactly what you are comparing, because it
> matters.
> 
> Consider this piece of code:
> 
> public class App
> {
>     public static void main(String[] args)
>     {
>         int a = 1;
>         int b = 1;
> 
>         if (a == b) {
>             System.out.println("Equal!");
>         } else {
>             System.out.println("Different!");
>         }
>     }
> }
> 
> The expected outcome is "Equal!" and indeed it prints just that. Now
> consider the following code:
> 
> public class App
> {
>     public static void main(String[] args)
>     {
>         Integer a = new Integer(1);
>         Integer b = new Integer(1);
> 
>         if (a == b) {
>             System.out.println("Equal!");
>         } else {
>             System.out.println("Different!");
>         }
>     }
> }
> 
> The result of running this bit of code is "Different!". With == you are 
> telling
> the java compiler to compare the two variables. The variable are references
> to Objects, so it will do exactly what you tell it to do, compare the two 
> object
> references. As you give it two different objects, the result willl be
> "Different!". The correct way of comparing the contents of two objects is to
> use the equals method. Consider the following piece of code:
> 
> public class App
> {
>     public static void main(String[] args)
>     {
>         Integer a = new Integer(1);
>         Integer b = new Integer(1);
> 
>         if (a.equals(b)) {
>             System.out.println("Equal!");
>         } else {
>             System.out.println("Different!");
>         }
>     }
> }
> 
> 
> This will again be "Equals!".
> 
> Why is this often a problem? There are a lot or reasons why these bugs came
> to exist in CloudStack (or any other project). For example somebody might
> cause this bug by changing the return type of a function from long to Long.
> The first one is a primitive which can be compared with == and the second
> one is an Object which might result in another comparison than you intended.
> Findbugs will catch these types of comparisons and warn you for them. See
> commit d1efdca50622a0b67ae1a286aad3297b1c748e9e for an example.
> 
> 
> 
> Oh and what does this print?
> 
> public class App
> {
>     public static void main(String[] args)
>     {
>         Integer a = 1;
>         Integer b = 1;
> 
>         if (a.equals(b)) {
>             System.out.println("Equal!");
>         } else {
>             System.out.println("Different!");
>         }
>     }
> }
> 
> 
> Surprise!, it prints "Equals!".  This is a boxed integer and java keeps a 
> pool of
> these so internally the object is cached and both a and b get the same
> objects assigned to them by the internal boxing logic. Just never rely on 
> this!
> It only works in specific cases and is implementation specific per JVM vendor
> and JVM version.
> 
> Cheers,
> 
> Hugo
> 
> 
> P.S. If you have another anti pattern feel free to post em in this thread.

Reply via email to