ProgramlamaJava geliştirici

Java'da record sınıfı nedir, ne amaçla kullanılır ve hangi sınırlamaları vardır?

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

Cevap.

Sorunun Tarihi:

Record sınıfları (record), Java 14'te önizleme olarak ortaya çıktı, Java 16 sürümünden itibaren bu özellik kararlı bir işlevselliğe dönüştü. Değişmez (immutable) veri saklama kapsayıcıları olarak, value-objects'a benzer bir şekilde, klasik DTO ve POJO'ların çok fazla kelime içermesine bir tepki olarak tasarlanmıştır.

Sorun:

Veri içeren basit nesnelerin constructor, equals(), hashCode(), toString() gibi yöntemlerini manuel olarak uygulamak zorundaydık. Bu, hatalara açık ve bir çok satır kod gerektiren rutin bir işti.

Çözüm:

Record sınıfı tek bir satırda tanımlanır ve otomatik olarak bir constructor, getter'lar, equals(), hashCode(), toString() metodları elde eder. Record alanları değişmez (final) olup, kayıtlar özellikle uygulama katmanları arasında bilgi iletimi için kullanışlıdır.

Kod örneği:

public record Point(int x, int y) {} Point p = new Point(3, 5); System.out.println(p.x()); // 3 System.out.println(p); // Point[x=3, y=5]

Anahtar özellikler:

  • Değişmezlik: alanlar final, değerler yalnızca constructor üzerinden atanır.
  • Standart yöntemlerin otomatik üretilmesi.
  • Başka sınıflardan (Object hariç) kalıtım alınamaz; arayüzler uygulanabilir.

Yanlış Sorular.

Kayıt nesnesinin oluşturulduktan sonra durumunu değiştirmek mümkün mü?

Hayır - tüm alanlar final'dır, değeri hiçbir şekilde değiştiremezsiniz.

Kayıt oluşturucusunda standart dışı bir mantık oluşturmak mümkün mü?

Evet, kompakt veya normal bir constructor tanımlayıp kontroller ekleyebilirsiniz:

public record Point(int x, int y) { public Point { if (x < 0 || y < 0) throw new IllegalArgumentException(); } }

Kayıt abstract olabilir mi ya da diğer sınıfların alanlarını/ mantığını miras alabilir mi?

Hayır - kayıt her zaman final'dır. Arayüzler uygulanabilir fakat sınıflar miras alınamaz, sadece Object hariç.

Tipik Hatalar ve Anti-Paterner

  • Alanların değiştirilebilir olmasını sağlama girişimi - sözdizimi buna izin vermez.
  • Kayıt içinde karmaşık mantık oluşturma, basit "veri kapsayıcıları" fikrini ihlal etme.
  • Kayıtların kullanımını gerektiren durumlarda, standart bir sınıfa ihtiyaç olduğu yerlerde kullanma.

Gerçek Hayat Örneği

Olumsuz Durum

Her bir istek/cevap için uzun POJO'lar kullanmak, equals, hashCode, toString, constructor ve getter'ları manuel olarak yazmak.

Artılar:

  • Tam uygulama esnekliği.

Eksiler:

  • Çok fazla kod.
  • Hata yapma riski yüksek.

Olumlu Durum

Tüm DTO'ları kayıt sınıflarına dönüştürme:

public record UserDTO(String login, String email) {}

Artılar:

  • Minimum kod.
  • Otomatik olarak doğru equals/hashCode.
  • Uygulamada hata yapma olasılığı zordur.

Eksiler:

  • Değiştirilebilir bir nesne veya özel bir mantık gerekiyorsa - kayıt uygun değildir.