Records (Java 16+)
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 51 / 87.
Basit veri taşıyan sınıflar oluştururken, genellikle tekrarlayan basmakalıp (boilerplate) kodlar yazarsınız: private alanlar, bir constructor, getter'lar, toString(), equals() ve hashCode(). Java 16, bu zahmeti ortadan kaldırmak için record'ları tanıttı.
Bir record, değiştirilemez (immutable) verileri tutmak için tasarlanmış özel bir sınıftır. Bunu, record anahtar kelimesi ve ardından gelen bileşen listesi ile bildirirsiniz:
record Person(String name, int age) { }
// Bu tek satır otomatik olarak şunları sağlar:
// - private final alanlar: name ve age
// - bir yapıcı (constructor): Person(String name, int age)
// - erişimci (accessor) metotlar: name() ve age()
// - toString(), equals(), ve hashCode()Bir record kullanmak oldukça basittir:
Person p = new Person("Alice", 30);
System.out.println(p.name()); // Alice
System.out.println(p.age()); // 30
System.out.println(p); // Person[name=Alice, age=30]Erişimci metotlarının get önekini kullanmadığına, sadece alanların adını aldığına dikkat edin. Record'lar örtük olarak final'dır, bu nedenle genişletilemezler. Tüm alanlar da final'dır, bu da record'ları doğası gereği değişmez (immutable) kılar.
İhtiyaç duyulursa özel metotlar ekleyebilir ve otomatik olarak oluşturulanları geçersiz kılabilirsiniz. Ayrıca bir compact constructor içinde doğrulama da ekleyebilirsiniz:
record Person(String name, int age) {
public Person {
if (age < 0) throw new IllegalArgumentException("Age cannot be negative");
}
}Recordlar; DTO'lar, API yanıtları veya boilerplate kod yazmaya gerek kalmadan basit, değişmez bir veri taşıyıcısına ihtiyaç duyduğunuz her senaryo için mükemmeldir.
Görev
KolayJava record'ların zarafetini sergileyen bir sinema bileti rezervasyon sistemi oluşturalım. Record'ların, özel metotlar ve doğrulama eklemenize izin verirken boilerplate (basmakalıp) kodları nasıl ortadan kaldırdığını göreceksiniz.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Movie.java: Üç bileşenden oluşan bir filmi temsil eden bir record oluşturun:title(String),genre(String) vedurationMinutes(int). Süreyi kullanıcı dostu bir formatta döndürengetFormattedDuration()adında özel bir metot ekleyin:[hours]h [minutes]m(örneğin, 142 dakika2h 22molur). Saatleri ve kalan dakikaları hesaplamak için tam sayı bölme ve modülo kullanın.Ticket.java: Üç bileşenden oluşan bir sinema biletini temsil eden bir record oluşturun:movie(Movie),seatNumber(String) veprice(double). Fiyatı doğrulayan kompakt bir yapıcı (compact constructor) ekleyin; eğer fiyat sıfıra eşit veya sıfırdan küçükse,Price must be positivemesajıyla birIllegalArgumentExceptionfırlatın. Ayrıca, çok satırlı bir dize döndürenprintTicket()adında özel bir metot ekleyin:========== TICKET ========== Movie: [movie title] Genre: [movie genre] Duration: [formatted duration from movie] Seat: [seatNumber] Price: $[price] ============================Main.java: Rezervasyon sisteminizi bir araya getirin! Beş girdi alacaksınız: film başlığı (String), tür (String), dakika cinsinden süre (int), koltuk numarası (String) ve bilet fiyatı (double).İlk üç girdiyle bir Movie record'u oluşturun, ardından film, koltuk numarası ve fiyatla bir Ticket record'u oluşturun. Biletiniz üzerinde
printTicket()metodunu çağırmanın sonucunu yazdırın.
Sırasıyla beş girdi alacaksınız: film başlığı, tür, süre (dakika), koltuk numarası ve fiyat.
Record'ların geleneksel sınıflara göre ne kadar daha temiz olduğuna dikkat edin; yapıcılar, getter'lar, toString(), equals() veya hashCode() yazmanıza gerek yok. Kompakt yapıcı, alan atamalarını tekrarlamadan doğrulama eklemenize olanak tanır ve ihtiyaç duyduğunuzda hala özel metotlar ekleyebilirsiniz!
Kopya kağıdı
Java 16, basit veri taşıyan sınıflar için boilerplate (basmakalıp) kodları ortadan kaldırmak amacıyla records (kayıtlar) özelliğini tanıttı. Bir record, değişmez (immutable) verileri tutmak için tasarlanmış özel bir sınıftır.
record anahtar kelimesi ve ardından bileşen listesi ile bir record bildirin:
record Person(String name, int age) { }Bu otomatik olarak şunları sağlar:
- Private final alanlar
- Bir kurucu (constructor)
- Erişimci (accessor) metotlar (
getöneki olmadan) toString(),equals()vehashCode()
Bir record kullanımı:
Person p = new Person("Alice", 30);
System.out.println(p.name()); // Alice
System.out.println(p.age()); // 30
System.out.println(p); // Person[name=Alice, age=30]Record'lar örtük olarak final'dır ve genişletilemezler. Tüm alanlar final'dır, bu da record'ları doğası gereği değişmez (immutable) kılar.
Kompakt bir kurucu (compact constructor) kullanarak doğrulama ekleyin:
record Person(String name, int age) {
public Person {
if (age < 0) throw new IllegalArgumentException("Age cannot be negative");
}
}Record'lara özel metotlar ekleyebilirsiniz:
record Person(String name, int age) {
public String getInfo() {
return name + " is " + age + " years old";
}
}Kendin dene
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String title = scanner.nextLine();
String genre = scanner.nextLine();
int durationMinutes = Integer.parseInt(scanner.nextLine());
String seatNumber = scanner.nextLine();
double price = Double.parseDouble(scanner.nextLine());
// TODO: title, genre ve durationMinutes ile bir Movie kaydı oluşturun
// TODO: movie, seatNumber ve price ile bir Ticket kaydı oluşturun
// TODO: printTicket() metodunu kullanarak bileti yazdırın
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı