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:
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ç.
Her bir istek/cevap için uzun POJO'lar kullanmak, equals, hashCode, toString, constructor ve getter'ları manuel olarak yazmak.
Artılar:
Eksiler:
Tüm DTO'ları kayıt sınıflarına dönüştürme:
public record UserDTO(String login, String email) {}
Artılar:
Eksiler: