ProgramlamaBackend geliştirici

Java'da kalıp eşleştirme (pattern matching) nedir, hangi aşamada uygulanıyor, ne için kullanılır ve bilinmesi gereken nuanslar nelerdir? Bir örnek verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Konu tarihçesi

Kalıp eşleştirme — fonksiyonel ve betik dillerden alınan bir yöntem olup, türü kontrol etmeyi ve verileri tek adımda çıkarmayı sağlar. Java'da kalıp eşleştirme geliştirilmesi Java 14 ile başlamış (önizleme özelliği), Java 16-17 ile geliştirilmiş ve son sürümlerde switch yapısına genişletilmiştir.

Sorun

Klasik tür kontrolü ve dönüştürme yöntemi karmaşık görünüyordu:

if (obj instanceof String) { String s = (String) obj; ... }

Gereksiz değişkenler, fazla şablon kod ve tür dönüştürme hatası riski ortaya çıkıyordu.

Çözüm

Kalıp eşleştirme, tür kontrolü, yeni bir değişkenin tanımlanması ve kullanılmasını tek bir ifadede birleştirmeyi sağlar:

if (obj instanceof String s) { System.out.println(s.length()); }

Benzer kalıplar artık switch yapısında da ortaya çıkmakta, bu da kodu daha özlü hale getirip hata riskini azaltmaktadır.

Ana özellikler:

  • Özlü ve güvenli tür işleme.
  • Dönüşümlerde hata sayısının azalması.
  • Kodun bakımı ve yeni türlerle genişletme kolaylığı.

Kandırmaca soruları.

Kalıp eşleştirmeyi özel (kullanıcı) sınıflar için kullanabilir miyiz yoksa sadece standart türler için mi?

Herhangi bir sınıf için kullanılabilir. Kalıp eşleştirme, instanceof'un uygulanabildiği tüm sınıflar için geçerlidir.

Desen değişkeni if/switch bloğunun dışında erişilebilir mi?

Hayır, kalıp eşleştirme içinde tanımlanan değişken yalnızca o blokta görünür (örneğin, if veya switch durumunda).

Kod örneği:

if (obj instanceof Integer i) { // i sadece bu blokta görünür System.out.println(i + 10); } // Burada i erişilemez

Kalıp eşleştirmeyi jeneriklerle kullanabilir miyiz?

Evet, şöyle:

Object list = List.of("a", "b"); if (list instanceof List<?> l) { System.out.println(l.size()); }

Ancak, ham türlerle çalışma ve parametreli tiplere dönüşüm hala type erasure nedeniyle sınırlıdır.

Tipik hatalar ve anti-paterller

  • Kalıp eşleştirmenin otomatik olarak null'ı işlediğini varsaymak: eğer nesne null ise, koşul sağlanmaz (instanceof null ile her zaman false'dur).
  • Kalıp eşleştirmeyi yalnızca getClass() metodunun yeterli olduğu yerlerde kullanmak.
  • Kalıp eşleştirmeyi çok sık kullanmak, niyetler belirsizleşirse mimariyi bozabilir.

Gerçek yaşam örneği

Olumsuz durum

Ekip, kalıp eşleştirmeyi içsel DTO'lar, servis sınıfları ve yeterince polimorfizm gerektiren durumlar dahil her yerde uyguladı. Kod instanceof'a çok bağımlı hale geldi, sınıf hiyerarşilerinin rolü belirsizleşti.

Artıları:

  • Hızlı uygulama.
  • Özlü tarz.

Eksileri:

  • Mimari hatalar.
  • Okunabilirlik düşüklüğü.

Olumlu durum

Projede kalıp eşleştirme sadece genel arayüzler, yardımcı araçlar ve bilinmeyen türdeki koleksiyonların işlenmesi için kullanıldı. OOP mimarisi korunmuş, model yalnızca gerektiği yerlerde kullanılmıştır.

Artıları:

  • Okunabilir kod.
  • Mimari desteği.

Eksileri:

  • Dikkatli tasarım ve JDK versiyon bilgisi gerektirir.