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 kalıp kodlar yazarsınız: private alanlar, bir kurucu, getter'lar, toString(), equals() ve hashCode(). Java 16, bu zahmetli işi ortadan kaldırmak için record yapılarını kullanıma sundu.
record, değiştirilemez verileri tutmak için tasarlanmış özel bir sınıftır. Bunu, record anahtar sözcüğünün ardından bileşen listesini yazarak bildirirsiniz:
record Person(String name, int age) { }
// O tek satır otomatik olarak şunları sağlar:
// - private final alanlar: name ve age
// - bir constructor: Person(String name, int age)
// - erişim metotları: name() ve age()
// - toString(), equals() ve hashCode()Bir record kullanmak kolaydır:
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 get ön ekini kullanmadığına dikkat edin: bunlar yalnızca alanların adlarını alır. Record'lar örtük olarak final olduğundan genişletilemezler. Tüm alanlar da final olduğundan record'lar doğaları gereği değişmezdir.
Gerekirse özel yöntemler ekleyebilir ve otomatik olarak oluşturulanları geçersiz kılabilirsiniz. Ayrıca compact constructor içinde doğrulama ekleyebilirsiniz:
record Person(String name, int age) {
public Person {
if (age < 0) throw new IllegalArgumentException("Age cannot be negative");
}
}Record'lar, standart kod yazmadan basit ve değişmez bir veri kapsayıcısına ihtiyaç duyduğunuz DTO'lar, API yanıtları veya herhangi bir senaryo için mükemmeldir.
Görev
KolayJava record'larının zarafetini sergileyen bir film bileti rezervasyon sistemi oluşturalım. Record'ların, özel metotlar ve doğrulama eklemenize yine de izin verirken gereksiz kodları nasıl ortadan kaldırdığını göreceksiniz.
Kodunuzu üç dosya arasında düzenleyeceksiniz:
Movie.java: Üç bileşenle bir filmi temsil eden bir record oluşturun:title(String),genre(String) vedurationMinutes(int). Süreyi okunabilir bir biçimde döndürengetFormattedDuration()adlı özel bir metot ekleyin:[hours]h [minutes]m(örneğin, 142 dakika2h 22molur). Saatleri ve kalan dakikaları hesaplamak için tamsayı bölmesi ve mod alma işlemlerini kullanın.Ticket.java: Üç bileşenle bir film biletini temsil eden bir record oluşturun:movie(Movie),seatNumber(String) veprice(double). Bileti doğrulayan kompakt bir kurucu ekleyin; fiyat sıfırdan küçük veya eşitse,IllegalArgumentExceptionmesajıyla birPrice must be positivefırlatın. Ayrıca aşağıdaki çok satırlı dizeyi döndürenprintTicket()adlı ö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()çağrısının sonucunu yazdırın.
Beş girdiyi şu sırayla alacaksınız: film başlığı, tür, süre (dakika), koltuk numarası ve fiyat.
Record'ların geleneksel sınıflara kıyasla ne kadar daha temiz olduğuna dikkat edin: kurucular, getter'lar, toString(), equals() veya hashCode() yazmanız gerekmez. Kompakt kurucu, alan atamalarını tekrarlamadan doğrulama eklemenizi sağlar; ayrıca gerektiğinde özel metotlar da ekleyebilirsiniz!
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ştur
// TODO: movie, seatNumber ve price ile bir Ticket kaydı oluştur
// TODO: printTicket() metodunu kullanarak bileti yazdır
}
}
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ıKendi başına pratik yap: Online Java derleyicisi