0Pricing
Java Academy · Pelajaran

Pengenalan Record

Deklarasikan record sebagai wadah data ringkas yang tidak dapat diubah, lalu pahami anggota yang dibuat secara otomatis.

Pengenalan Record adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Memperkenalkan Record

Record Java (Java 16+) adalah cara ringkas untuk mendeklarasikan kelas pembawa data yang tidak dapat diubah. Record secara otomatis menghasilkan kode boilerplate: konstruktor, metode pengambil, equals, hashCode, dan toString.

Mendeklarasikan Record

Gunakan kata kunci record, diikuti nama record dan daftar komponennya. Setiap komponen menjadi bidang private final dan metode accessor publik.

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

Anggota yang Dibuat Otomatis

Kompilator secara otomatis menghasilkan hal-hal berikut untuk setiap record: konstruktor kanonis, accessor publik, equals(), hashCode(), dan toString(). Anda tidak perlu menulisnya secara manual.

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]

Record Tidak Dapat Diubah

Komponen record bersifat final. Anda tidak dapat mengubahnya setelah konstruksi — record merepresentasikan objek nilai yang tidak dapat diubah.

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]

Record Hanya Memperluas Object

Record secara implisit memperluas java.lang.Record dan tidak dapat memperluas kelas lain. Record dapat mengimplementasikan antarmuka.

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

Record dalam Koleksi

Karena record mengimplementasikan equals dan hashCode dengan benar berdasarkan semua komponennya, record dapat digunakan dengan benar sebagai kunci Map dan elemen Set.

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

Record sebagai DTO

Record sangat ideal untuk Objek Transfer Data (DTO) dalam API REST — record membawa data antarlapisan tanpa perilaku.

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);

Membongkar Record

Record sangat cocok dipadukan dengan pencocokan pola. Anda dapat membongkarnya dalam ekspresi switch (Java 21+).

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

Serialisasi Record

Record secara alami mengimplementasikan Serializable jika dideklarasikan demikian. Record juga langsung bekerja dengan baik bersama pustaka JSON (Jackson, Gson).

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

Record Bersarang

Record dapat memuat record lain sebagai komponen, sehingga Anda dapat membangun grafik objek kaya yang tidak dapat diubah.

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

Keterbatasan Record

Record memiliki beberapa batasan yang perlu diperhatikan:

  • Tidak dapat memperluas kelas lain (secara implisit memperluas Record)
  • Komponen selalu final — tidak ada keadaan yang dapat diubah
  • Tidak dapat mendeklarasikan bidang instans di luar daftar komponen
  • Tidak dapat bersifat abstrak
// 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]

Pemeriksaan Singkat

Anggota apa saja yang secara otomatis dihasilkan oleh kompilator Java untuk sebuah record?

Rangkuman: Memperkenalkan Record

Hal-hal penting:

  • Record mendeklarasikan pembawa data yang tidak dapat diubah dengan kode boilerplate minimal
  • Yang dibuat otomatis: konstruktor kanonis, accessor, equals, hashCode, dan toString
  • Komponen bersifat final — record tidak dapat diubah secara desain
  • Record dapat mengimplementasikan antarmuka, tetapi tidak dapat memperluas kelas
  • Sangat cocok untuk DTO, objek nilai, dan respons API
  • Dapat digunakan dengan benar sebagai kunci HashMap dan elemen HashSet berkat kesetaraan struktural

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengenalan Record” gratis?

Ya — teks lengkap “Pengenalan Record” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pengenalan Record”?

Deklarasikan record sebagai wadah data ringkas yang tidak dapat diubah, lalu pahami anggota yang dibuat secara otomatis. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Pengenalan Record” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pengenalan Record
  2. Konstruktor Ringkas dan Validasi
  3. Metode Kustom pada Record
  4. Record vs Class vs Lombok
← Kembali ke Java Academy