Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Java 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) ve durationMinutes (int). Süreyi okunabilir bir biçimde döndüren getFormattedDuration() adlı özel bir metot ekleyin: [hours]h [minutes]m (örneğin, 142 dakika 2h 22m olur). 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) ve price (double). Bileti doğrulayan kompakt bir kurucu ekleyin; fiyat sıfırdan küçük veya eşitse, IllegalArgumentException mesajıyla bir Price must be positive fırlatın. Ayrıca aşağıdaki çok satırlı dizeyi döndüren printTicket() 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
        
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi