0Pricing
Java Academy · Pelajaran

Record vs Class vs Lombok

Bandingkan record dengan class tradisional dan anotasi Lombok untuk memilih alat yang tepat.

Record vs Class vs Lombok adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Record vs Kelas vs Lombok

Java menyediakan beberapa pendekatan untuk membuat tipe pembawa data: kelas biasa dengan kode boilerplate, Record (Java 16+), atau anotasi Lombok. Pemilihan yang tepat bergantung pada kasus penggunaannya.

Masalah Kode Boilerplate

Kelas Java biasa untuk pembawa data sederhana memerlukan banyak kode boilerplate: konstruktor, metode pengambil, equals, hashCode, dan toString — semuanya hanya untuk beberapa bidang.

// Traditional class — lots of boilerplate
class ProductOld {
    private final String id;
    private final String name;
    private final double price;

    public ProductOld(String id, String name, double price) {
        this.id = id; this.name = name; this.price = price;
    }
    public String getId() { return id; }
    public String getName() { return name; }
    public double getPrice() { return price; }

    @Override public boolean equals(Object o) { /* ... */ }
    @Override public int hashCode() { /* ... */ }
    @Override public String toString() { /* ... */ }
}

Solusi Record

Record memadatkan kelas yang sama menjadi satu baris. Kompilator secara otomatis menghasilkan seluruh kode boilerplate.

// Record — one line, same functionality
record Product(String id, String name, double price) {}

// Usage is almost identical except accessors use component names (no get prefix)
Product p = new Product("P001", "Laptop", 999.99);
System.out.println(p.id());     // P001 (not getId())
System.out.println(p.name());   // Laptop
System.out.println(p.price());  // 999.99
System.out.println(p);          // Product[id=P001, name=Laptop, price=999.99]

@Data dan @Value dari Lombok

Lombok menghasilkan kode boilerplate saat kompilasi melalui anotasi. @Value membuat kelas yang tidak dapat diubah dan mirip dengan record; @Data membuat kelas yang dapat diubah.

// Lombok @Value — immutable (closest to record)
import lombok.Value;

@Value
public class LombokProduct {
    String id;
    String name;
    double price;
    // Lombok generates: all-args constructor, getters, equals, hashCode, toString
    // Note: accessors follow getX() naming convention (getPrice(), not price())
}

// Lombok @Data — mutable
import lombok.Data;
@Data
public class MutableProduct {
    private String id;
    private String name;
    private double price;
    // Generates: getters, setters, equals, hashCode, toString, no-args constructor
}

Perbedaan Utama

Perbedaan penting antara record, Lombok @Value, dan kelas biasa:

  • Penamaan accessor: Record menggunakan name(); Lombok menggunakan getName()
  • Varian yang dapat diubah: Record selalu tidak dapat diubah; Lombok menyediakan @Data agar dapat diubah
  • Pewarisan: Record tidak dapat memperluas kelas; kelas Lombok dapat melakukannya
  • Dependensi alat build: Lombok memerlukan penyiapan pemroses anotasi; Record sudah tersedia secara bawaan

Kapan Menggunakan Record

Record ideal digunakan ketika:

  • Tipe tersebut terutama berfungsi sebagai pembawa data transparan (DTO, objek nilai)
  • Ketidakberubahan diinginkan berdasarkan desain
  • Anda menggunakan Java 16+ dan menginginkan tanpa dependensi
  • Tipe tersebut berpartisipasi dalam pencocokan pola (sealed + record)
// Perfect record use cases:
record Coordinates(double lat, double lon) {}
record JwtClaims(String subject, String role, long expiresAt) {}
record PageRequest(int page, int size, String sortBy) {}
record ErrorResponse(int code, String message, String path) {}

// These are all simple data carriers with no mutable state

Kapan Menggunakan Lombok

Lombok lebih disukai ketika:

  • Anda memerlukan bean yang dapat diubah (misalnya entitas JPA atau kelas konfigurasi Spring)
  • Penamaan accessor harus mengikuti konvensi JavaBeans (getX) agar kompatibel dengan framework
  • Anda memerlukan @Builder untuk konstruksi objek yang kompleks
  • Diperlukan kemampuan mengubah sebagian atribut (@NonFinal pada beberapa atribut)
// Lombok @Builder — great for complex object construction
import lombok.*;

@Builder
@Value
public class EmailMessage {
    String to;
    String from;
    String subject;
    String body;
    List<String> attachments;
}

EmailMessage msg = EmailMessage.builder()
    .to("user@example.com")
    .from("noreply@app.com")
    .subject("Welcome!")
    .body("Thank you for signing up")
    .attachments(List.of())
    .build();

Kapan Menggunakan Kelas Biasa

Kelas biasa tetap sesuai digunakan ketika:

  • Kelas tersebut memiliki perilaku kompleks di luar sekadar membawa data
  • Anda perlu memperluas kelas lain
  • Diperlukan kendali terperinci atas hashCode/equals
  • Diperlukan state yang dapat diubah dengan enkapsulasi
// Plain class — when behavior dominates over data
class ShoppingCart {
    private final List<CartItem> items = new ArrayList<>();
    private final String customerId;

    public ShoppingCart(String customerId) {
        this.customerId = customerId;
    }

    public void addItem(CartItem item) { items.add(item); }
    public void removeItem(String sku) { items.removeIf(i -> i.sku().equals(sku)); }
    public double total() { return items.stream().mapToDouble(CartItem::lineTotal).sum(); }
    public boolean isEmpty() { return items.isEmpty(); }
}

Menggabungkan Record dan Kelas

Record dan kelas dapat bekerja sama dengan lancar. Gunakan record untuk data yang tidak dapat diubah di dalam kelas yang mengelola state yang dapat diubah.

// Record for the immutable event data
record UserEvent(String userId, String action, java.time.Instant timestamp) {
    public static UserEvent now(String userId, String action) {
        return new UserEvent(userId, action, java.time.Instant.now());
    }
}

// Class for the mutable event store
class EventLog {
    private final List<UserEvent> events = new ArrayList<>();

    public void record(String userId, String action) {
        events.add(UserEvent.now(userId, action));
    }

    public List<UserEvent> eventsFor(String userId) {
        return events.stream()
            .filter(e -> e.userId().equals(userId)).toList();
    }
}

Record dalam Spring Boot

Record terintegrasi dengan baik dengan Spring Boot sebagai body permintaan/respons. Pemeta Jackson milik Spring dapat menanganinya dengan konfigurasi minimal.

// Spring Boot REST controller using records
import org.springframework.web.bind.annotation.*;

record CreateProductRequest(String name, double price, String category) {}
record ProductResponse(long id, String name, double price, String category) {}

@RestController
@RequestMapping("/api/products")
class ProductController {
    @PostMapping
    public ProductResponse create(@RequestBody CreateProductRequest req) {
        // Jackson automatically deserializes JSON into the record
        long id = productService.save(req);
        return new ProductResponse(id, req.name(), req.price(), req.category());
    }
}

Perbandingan Performa

Ketiga pendekatan tersebut pada dasarnya menghasilkan bytecode yang sama untuk pembawa data sederhana. Performanya identik—pilihannya bergantung pada pengalaman pengembang dan persyaratan.

// All three compile to approximately equivalent bytecode:
// - Records: compiler-generated, always immutable
// - Lombok @Value: annotation-processor-generated, always immutable
// - Plain class: hand-written

// The key runtime difference:
// Records: accessor is a method matching field name (price() not getPrice())
// Lombok/Class: accessor follows JavaBeans (getPrice())

// Jackson compatibility:
// Records: work natively in Jackson 2.12+ with no config
// Lombok: work with @JsonProperty or jackson-databind-lombok module

Pemeriksaan Singkat

Konvensi penamaan apa yang diikuti accessor record?

Rangkuman: Record vs Kelas vs Lombok

Hal-hal penting:

  • Record secara otomatis menghasilkan konstruktor, accessor (tanpa awalan get), equals, hashCode, dan toString
  • Record selalu tidak dapat diubah; gunakan kelas biasa untuk state yang dapat diubah
  • Lombok @Value mendekati record, tetapi menggunakan penamaan getX() dan memerlukan penyiapan
  • Lombok @Builder sangat unggul untuk konstruksi objek kompleks dengan banyak atribut opsional
  • Record ideal untuk DTO, objek nilai, serta body permintaan/respons API
  • Kelas biasa tetap terbaik ketika perilaku lebih dominan atau pewarisan diperlukan

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Record vs Class vs Lombok” gratis?

Ya — teks lengkap “Record vs Class vs Lombok” 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 “Record vs Class vs Lombok”?

Bandingkan record dengan class tradisional dan anotasi Lombok untuk memilih alat yang tepat. 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 4 dari 4.

Berapa lama pelajaran “Record vs Class vs Lombok” 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