Java’da Record’lar
Java’da Record’lar – OpenJDK 14 içinde JEP 359 kapsamında geliştirilen class veya enum benzeri yeni programlama dili bileşenlerine denmektedir. Record’lar Java dilindeki sınıflara benzemektedir fakat Java sınıfları aksine daha kolay bir şekilde tanımlanabilmektedirler. Şimdi bir örneklemeyle bunu açıklayalım
Aşağıda koordinat sisteminde bir noktayı temsil eden Point sınıfını görmektesiniz. Tasarım açısından bakıldığında Point sınıfının sadece x ve y adında iki bilgi taşıyan bir “veri taşıyıcı sınıf” olarak değerlendirebiliriz.
public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
Setter/getter metodları ve constructor’ların basit veri sınıflarında bile kendini tekrarlayan bir kalıpta yazılıyor olması zaman zaman eleştiri konusu olmuştur. Sizler de bunu düşünmüş veya birilerinden duymuş olabilirsiniz. Record’lar ise tam da bu noktaya parmak basarak daha kolay yazılabilen ve kendi kuralları olan class benzeri yapılar olarak karşımıza çıkmaktadır.
Eğer örnekleyecek olursak, yukarıdaki Point sınıfını record’lar ile aşağıdaki gibi tekrardan yazabiliriz.
record Point(int x, int y) { }
Buradaki sihiri sanırım görmektesiniz. Record tipinden örnekler sınıflarda olduğu gibi new kelimesiyle oluşturulmaktadır:
Point point= new Point(5,10);
Oluşturulan record içindeki alanlara ise kendi isminde oluşturulan metodlar ile erişilmektedir.
Point point= new Point(5,10); int x= point.x(); int y= point.y();
Siz de eğer bu yeni Java özelliğini test etmek istiyorsanız https://tryjshell.org/ adresi üzerinden veya kendi cihazınızda JDK 14 kurarak deneyebilirsiniz. Şimdi ise Record’ların bazı özelliklerinden bahsedelim.
Record’ların özellikleri:
- Record’un kendisi ve veri alanları ‘final’ olarak işaretlenmiştir. Dolayısıyla extend edilememekte ve oluşturulduktan sonra veri alanlarına tekrar atama yapılamamaktadır.
- Değişken sayısı ihtiyacınıza göre bir, iki, üç veya daha fazla sayıda olabilir.
- Veri alanlarına karşılık gelen metodları ve kurucu metod siz tanımlamasanız bile public erişime sahiptir.
- equals ve hashCode metodları tanımlanan her bir veri alanını dahil edecek şekilde hesaplanmaktadır.
- Record ismini, değişkenleri ve değerlerini anlamlı şekilde çıktılayacak şekilde toString metoduna sahiptir.
- Record içindeki tanımlamalar (constructor, alanlar ve metodları) asıl yapısına ve kurallarına bağlı kalmak şartıyla el ile yazılabilmektedir. Örneğin aşağıdaki gibi bir kullanım olasıdır.
record Range(int low, int high) { public Range { if (low > high) { String msg= "Low cannot be greater than high. (low=%d,high=%d)" throw new IllegalArgumentException(String.format(msg, low, high)); } } }
Okuduğunuz için teşekkür eder ve esenlikler dilerim.
Kaynaklar: