0Pricing
Java Academy · Ders

Record'lara Giriş

Record'ları kısa ve değişmez veri taşıyıcıları olarak bildirin ve otomatik oluşturulan üyelerini anlayın.

Record'lara Giriş, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Kayıtları Tanıtma

Java Kayıtları (Java 16 ve sonrası), değişmez veri taşıyan sınıfları kısa ve öz biçimde tanımlamanın bir yoludur. Kurucuyu, erişim yöntemlerini, equals, hashCode ve toString işlemlerini içeren tekrarlayan kodu otomatik olarak oluştururlar.

Kayıt Tanımlama

record anahtar sözcüğünü, kayıt adı ve bileşen listesinin ardından kullanın. Her bileşen, private final bir alan ve herkese açık bir erişim yöntemi hâline gelir.

record Point(double x, double y) {}

Point p = new Point(3.0, 4.0);
System.out.println(p.x());      // 3.0 (accessor, not getX())
System.out.println(p.y());      // 4.0
System.out.println(p);          // Point[x=3.0, y=4.0]
System.out.println(p.equals(new Point(3.0, 4.0))); // true

Otomatik Oluşturulan Üyeler

Derleyici her kayıt için şunları otomatik olarak oluşturur: kanonik kurucu, herkese açık erişim yöntemleri, equals(), hashCode() ve toString(). Bunları elle yazmanız gerekmez.

record Product(String name, double price, int stock) {}

Product p1 = new Product("Widget", 9.99, 100);
Product p2 = new Product("Widget", 9.99, 100);

System.out.println(p1.name());          // Widget
System.out.println(p1.price());         // 9.99
System.out.println(p1.equals(p2));      // true (structural)
System.out.println(p1.hashCode() == p2.hashCode()); // true
System.out.println(p1);                 // Product[name=Widget, price=9.99, stock=100]

Kayıtlar Değişmezdir

Kayıt bileşenleri final niteliğindedir. Oluşturma işleminden sonra bunları değiştiremezsiniz; kayıtlar değişmez değer nesnelerini modeller.

record Money(long cents, String currency) {}

Money price = new Money(999, "USD");
// price.cents = 500; // Compile error — final field!

// To "update" a record, create a new one
Money discounted = new Money(price.cents() - 100, price.currency());
System.out.println(discounted); // Money[cents=899, currency=USD]

Kayıtlar Yalnızca Object'i Genişletir

Kayıtlar örtük olarak java.lang.Record sınıfını genişletir ve başka sınıfları genişletemez. Arayüzleri uygulayabilirler.

interface Describable { String describe(); }

record Circle(double radius) implements Describable {
    public String describe() {
        return String.format("Circle with radius %.1f", radius);
    }

    public double area() {
        return Math.PI * radius * radius;
    }
}

Circle c = new Circle(5.0);
System.out.println(c.describe()); // Circle with radius 5.0
System.out.printf("Area: %.2f%n", c.area()); // Area: 78.54

Koleksiyonlarda Kayıtlar

Kayıtlar, tüm bileşenlere dayalı equals ve hashCode işlemlerini doğru biçimde uyguladığı için eşleme anahtarları ve Set öğeleri olarak düzgün çalışır.

import java.util.*;

record Coordinate(int row, int col) {}

Map<Coordinate, String> grid = new HashMap<>();
grid.put(new Coordinate(0, 0), "Origin");
grid.put(new Coordinate(1, 2), "Target");

// Lookup with equal-valued record works correctly
System.out.println(grid.get(new Coordinate(0, 0))); // Origin
System.out.println(grid.get(new Coordinate(1, 2))); // Target

Set<Coordinate> visited = new HashSet<>();
visited.add(new Coordinate(3, 3));
System.out.println(visited.contains(new Coordinate(3, 3))); // true

DTO Olarak Kayıtlar

Kayıtlar, REST API'lerindeki Veri Aktarım Nesneleri (DTO'lar) için idealdir; davranış taşımadan katmanlar arasında veri aktarırlar.

record CreateUserRequest(String email, String displayName, String plan) {}

record UserResponse(long id, String email, String displayName,
                    String plan, String createdAt) {}

// Simulating a service call
static UserResponse createUser(CreateUserRequest req) {
    long id = 42L;
    return new UserResponse(id, req.email(), req.displayName(),
        req.plan(), java.time.Instant.now().toString());
}

CreateUserRequest req = new CreateUserRequest("alice@example.com", "Alice", "PRO");
UserResponse resp = createUser(req);
System.out.println(resp);

Kayıtların Yapısını Çözme

Kayıtlar, örüntü eşlemeyle iyi birlikte çalışır. Bunların yapısını seçim ifadelerinde çözebilirsiniz (Java 21 ve sonrası).

sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
record Triangle(double base, double height) implements Shape {}

static double area(Shape s) {
    return switch (s) {
        case Circle(double r)            -> Math.PI * r * r;
        case Rectangle(double w, double h) -> w * h;
        case Triangle(double b, double h) -> 0.5 * b * h;
    };
}

System.out.printf("%.2f%n", area(new Circle(5)));         // 78.54
System.out.printf("%.2f%n", area(new Rectangle(4, 6)));   // 24.00

Kayıtların Serileştirilmesi

Kayıtlar, kendilerine bu özellik tanımlandığında Serializable arayüzünü doğal olarak uygular. JSON kitaplıklarıyla (Jackson, Gson) kutudan çıktığı hâliyle iyi çalışırlar.

// With Jackson (add @JsonProperty if needed)
import com.fasterxml.jackson.databind.ObjectMapper;

record OrderSummary(String orderId, double total, String status) {}

ObjectMapper mapper = new ObjectMapper();
OrderSummary order = new OrderSummary("ORD-001", 149.99, "SHIPPED");

String json = mapper.writeValueAsString(order);
System.out.println(json);
// {"orderId":"ORD-001","total":149.99,"status":"SHIPPED"}

OrderSummary restored = mapper.readValue(json, OrderSummary.class);
System.out.println(order.equals(restored)); // true

İç İçe Kayıtlar

Kayıtlar, bileşen olarak başka kayıtlar içerebilir ve zengin, değişmez nesne grafikleri oluşturabilir.

record Address(String street, String city, String country) {}
record Customer(long id, String name, Address address) {}

Address addr = new Address("123 Main St", "New York", "US");
Customer customer = new Customer(1L, "Alice", addr);

System.out.println(customer.name());              // Alice
System.out.println(customer.address().city());   // New York
System.out.println(customer);                    // Customer[id=1, name=Alice, address=Address[street=123 Main St, city=New York, country=US]]

Kayıtların Sınırlamaları

Dikkat etmeniz gereken bazı kısıtlamalar vardır:

  • Başka sınıflar genişletilemez (örtük olarak Record sınıfını genişletir)
  • Bileşenler her zaman final niteliğindedir; değişebilir durum bulunamaz
  • Bileşen listesinin dışında örnek alanları tanımlanamaz
  • abstract olamazlar
// Records CAN have static fields and methods
record Temperature(double celsius) {
    static final double ABSOLUTE_ZERO = -273.15;

    public double toFahrenheit() {
        return celsius * 9.0/5.0 + 32;
    }

    public static Temperature fromFahrenheit(double f) {
        return new Temperature((f - 32) * 5.0/9.0);
    }
}
System.out.println(Temperature.fromFahrenheit(98.6)); // Temperature[celsius=37.0]

Kısa Denetim

Java derleyicisi bir kayıt için hangi üyeleri otomatik olarak oluşturur?

Özet: Kayıtları Tanıtma

Temel çıkarımlar:

  • Kayıtlar, çok az tekrarlayan kodla değişmez veri taşıyıcıları tanımlar
  • Otomatik oluşturulanlar: kanonik kurucu, erişim yöntemleri, equals, hashCode ve toString
  • Bileşenler final niteliğindedir; kayıtlar tasarım gereği değişmezdir
  • Kayıtlar arayüzleri uygulayabilir ancak sınıfları genişletemez
  • DTO'lar, değer nesneleri ve API yanıtları için idealdir
  • Yapısal eşitlik sayesinde HashMap anahtarları ve HashSet öğeleri olarak düzgün çalışır

Sıkça Sorulan Sorular

“Record'lara Giriş” dersi ücretsiz mi?

Evet — “Record'lara Giriş” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Record'lara Giriş” dersinde ne öğreneceğim?

Record'ları kısa ve değişmez veri taşıyıcıları olarak bildirin ve otomatik oluşturulan üyelerini anlayın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Record'lara Giriş” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Record'lara Giriş
  2. Kısa Yapıcılar ve Doğrulama
  3. Record'larda Özel Yöntemler
  4. Record'lar, Sınıflar ve Lombok
← Java Academy Sayfasına Dön