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 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.

challenge icon

Görev

Kolay

Java 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) ve durationMinutes (int). Süreyi kullanıcı dostu bir formatta döndüren getFormattedDuration() adında özel bir metot ekleyin: [hours]h [minutes]m (örneğin, 142 dakika 2h 22m olur). 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) ve price (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 positive mesajıyla bir IllegalArgumentException fırlatın. Ayrıca, çok satırlı bir dize döndüren printTicket() 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() ve hashCode()

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
        
    }
}
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