Konu geçmişi:
instanceof anahtar kelimesi, bir nesnenin belirli bir türe veya alt tipe ait olup olmadığını kontrol etmek için Java'da ortaya çıkmıştır. Bu mekanizma, nesnenin türünü çalışma zamanında kesinleştirmeye izin verir; bu durum, genel koleksiyonlar, çok biçimlilik ve tür dönüşümleri ile çalışmak için önemlidir.
Problemler:
Nesnenin türünün doğru bir şekilde tanımlanmaması, ClassCastException hataları veya tür dönüşümleri kontrol edilmeden yapıldığında kodun dalında yanlış bir mantığı işleme riskine yol açabilir. Ayrıca, instanceof kullanımı genellikle kötü tasarımın bir göstergesi olarak kabul edilir.
Çözüm:
instanceof, nesnenin belirtilen sınıfın bir örneği veya alt sınıflarından biri olup olmadığını veya bir arayüzü uygulayıp uygulamadığını doğrulayan true döner. Java 16 ile birlikte, if bloğunda otomatik tür dönüşümü yapan kalıp eşleştirmesi tanıtılmıştır.
Kod örneği:
Object obj = "Hello!"; if (obj instanceof String) { String s = (String) obj; // Dönüşüm güvenlidir System.out.println(s.length()); }
Java 16 ile:
if (obj instanceof String s) { System.out.println(s.length()); // s otomatik olarak String'e dönüştürülür }
Anahtar özellikler:
null instanceof Type her zaman false'dur)null instanceof SomeClass ne döner?
Her zaman false döner. Operatör, eğer nesne null ise, sonucun false olacağını garanti eder, NullPointerException'ı dışlar.
instanceof'ı generik parametrelerle kullanmak mümkün mü, örneğin if (obj instanceof List<String>)?
Hayır. Tür silinmesi (type erasure) nedeniyle, generik parametrelerin çalışma zamanında kontrol edilmesi mümkün değildir. Kontrol her zaman sadece raw tür üzerinden yapılır (örneğin, List).
Kod örneği:
List<String> list = ...; if (list instanceof List<String>) { ... } // Derleme hatası if (list instanceof List) { ... } // Geçerli
instanceof kullanımı kod tasarımındaki sorunları gösterebilir mi?
Evet. Sürekli instanceof kullanımı, soyutlamalar veya tasarımlar (örneğin, Visitor deseni) yerine kullanılması, genellikle OOP ilkeleri olan açık/kapalı ilkesinin ihlal edildiğini gösterir.
instanceof üzerinden kontrol yapılmadan tür dönüşümüinstanceof kullanımı (tiplere göre switch yerine çok biçimlilik)instanceof aracılığıyla generik türlerin kontrol edilmesi denemesiYöntemde, bir süper sınıfın tüm olası alt sınıflarını instanceof ile kontrol eden büyük bir if-else zinciri bulunur; her dal içinde tür dönüşümü ve ilgili yöntemin çağrısı yapılır.
Artıları:
Eksileri:
if-else yerine Visitor deseni uygulanmıştır: her alt sınıfın gerekli davranışı çağıran bir metodu vardır; bu da instanceof kullanımını ortadan kaldırır.
Artıları:
Eksileri: