Comparable — nesne sınıfı tarafından uygulanan bir arayüzdür. Doğal sıralama düzenini tanımlayan compareTo() metodunu belirler.
Comparator — compare(o1, o2) metodunu uygulayan ayrı bir arayüzdür. Sınıfın kodunu değiştirmeden birden fazla sıralama yöntemini tanımlamanıza olanak tanır.
Ne zaman kullanılmalı:
Örnekler:
// Comparable class Student implements Comparable<Student> { String name; int grade; public int compareTo(Student other) { return this.grade - other.grade; } } // Comparator Comparator<Student> byName = new Comparator<Student>() { public int compare(Student s1, Student s2) { return s1.name.compareTo(s2.name); } }; List<Student> students = ...; Collections.sort(students); // grade'e göre sıralama Collections.sort(students, byName); // name'e göre sıralama
Comparable'ı uygulamayan nesnelerin Listesini Comparator olmadan sıralamak mümkün mü?
Cevap: Hayır. Sınıf Comparable'ı uygulamıyorsa ve açıkça Comparator verilmemişse, koleksiyonu sıralama girişimi ClassCastException ile sonuçlanır.
Örnek:
class Animal {} List<Animal> animals = ...; Collections.sort(animals); // ClassCastException, eğer Comparable yoksa
Hikaye
Envanter projesinde Item sınıfı için Comparable'ı uygulamayı unuttum. Collections.sort(items) ile sıralama girişiminde bulundum. Sonuç olarak uygulama, compareTo() metodunun eksikliği nedeniyle sürekli ClassCastException ile çöktü.
Hikaye
Öğrencilerin değerlendirme servisinde, geliştirici yalnızca grade alanına göre compareTo() yönteminde karşılaştırma yaptı. Daha sonra isim ve doğum tarihine göre sıralama gerekti, ancak sınıf kodu yardımcı metodlarla genişledi, farklı Comparator kullanmak yerine karmaşık bir mantıkla compareTo() içinde sıralama yapıldı.
Hikaye
Çevrimiçi sipariş ürününde, siparişleri tarihe göre sıralamak için lambda ifadesi ile Comparator kullanmaya çalıştık, ancak tarih alanının null değerlerini göz önünde bulundurmayı unuttuk. Sonuç — teslimat tarihine sahip olmayan siparişlerin sıralanmasında beklenmedik NullPointerException'lar üretildi.