10 Nisan 2013 Çarşamba

Java'da iki Enum değerini karşılaştırmak

Java'da iki Enum değeri nasıl karşılaştırsınız? "==" operatorünü mü yoksa equals() metodunu mu kullanırsınız?
İkisi arasındaki fark nedir sorusu genellikle java iş göürşmelerinde sorulabilecek hileli sorulardan birtanesidir. Eğer Java'daki Enum değerlerle ilgili ayrıntılı bilginizyoksa bunu gönül rahatlığıyla cevaplamaya çekinirsiniz.

Enum nesneler String nesnelerin tersine == ve equals() metoduyla karşılaştırılabilirler. İkisi de aynı sonucu döndüreceklerdir. Çünkü Java.lang.Enum'ın equals() metodu içerisinde == ifadesini kullanır iki nesneyi karşılaştırırken.

Enum equals() metodu;

public final boolean equals(Object other) {
        return this==other;
}


1) Enum Karşılaştırma işlemini == ile yaptığınızda NullPointerException hatası almazsınız. Değerlerden biri null olsa bile sonuç olarak size false döndürecektir. Aynı işlemi equals() metodu ile yapmak istediğiniz de NullPointerException hatası alırsınız.

private enum Shape{
        RECTANGLE, SQUARE, CIRCLE, TRIANGLE;
} 

private enum Status{
        ON, OFF;
}

Shape unknown = null;
Shape circle = Shape.CIRCLE;      

boolean result = unknown == circle; //return false
result = unknown.equals(circle); //throws NullPointerException

2) == kullanmanın diğer avantajlarından birisi de Derleme (compile) esnasında güvenli olması. Derleme esnasında iki enum nesnesinin aynı enum tipinde olup olmadığını ya da eşitliğini kendi kendine kontrol eder.

3) == operatoru equals() metodundan daha hızlıdır. Operator kullanmak method çağırmaktan çok daha hızlı olmalı, değil mi.

compareTo metodu ile Enumları karşılaştırma
İki Enum'ı karşılaştırmak demek herzaman o iki Enum'ın eşit olup olmadığını kontrol etmek değildir. Bazen onları sorlamak ve belli bir sıraya koymayı da isteyebilirsiniz. Biliyoruz ki, Java'daki Comparable and Comparator sınıflarını kullanarak nesneleri karşılaştırabilir ya da sıraya koyabiliriz. Enum'ı da aynı şekilde elealabiliriz.

Java.lang.Enum sınıfımızı Comparable arayüz (interface'den) implements edebiliriz. Bildiğiniz gibi  compareTo() metodu sadece aynı tip nesneleri kıyaslar.
Aynı sıralama işlemini Enum'ın ordinal() metodu,  EnumSet ve EnumMap ilede yapabilirsiniz.

public final int compareTo(E o) {
 Enum other = (Enum)o;
 Enum self = this;

 if (self.getClass() != other.getClass() && // optimization
  self.getDeclaringClass() != other.getDeclaringClass()) throw new ClassCastException();

return self.ordinal - other.ordinal;
}

Eğer son satıra bakarsanız karşılaştırma için ordinal metodunun kullanıldığını görürsünüz.


Kaynak: http://javarevisited.blogspot.com/2013/04/how-to-compare-two-enum-in-java-equals.html#ixzz2Q4PBHXds

Hiç yorum yok:

Yorum Gönder