Record'lar, Sınıflar ve Lombok
Doğru aracı seçmek için record'ları geleneksel sınıflarla ve Lombok ek açıklamalarıyla karşılaştırın.
Record'lar, Sınıflar ve Lombok, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. 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, Sınıflar ve Lombok
Java, veri taşıyan türler oluşturmak için çeşitli yaklaşımlar sunar: tekrarlayan kod içeren yalın sınıflar, Kayıtlar (Java 16 ve sonrası) veya Lombok açıklamaları. Doğru seçimin belirlenmesi kullanım alanına bağlıdır.
Tekrarlayan Kod Sorunu
// 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() { /* ... */ }
}Kayıt Çözümü
Bir Kayıt, aynı sınıfı tek satıra sığdırır. Derleyici, tekrarlayan kodun tümünü otomatik olarak oluşturur.
// 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]Lombok @Data ve @Value
Lombok, açıklamalar aracılığıyla derleme zamanında tekrarlayan kodu üretir. @Value, kayıtlara benzer bir değişmez sınıf oluşturur; @Data ise değişebilir bir sınıf oluşturur.
// 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
}Temel Farklar
Records, Lombok @Value ve sıradan sınıflar arasındaki önemli farklar:
- Erişim adlandırması: Records
name()kullanır; LombokgetName()kullanır - Değiştirilebilir seçenek: Records her zaman değişmezdir; Lombok değiştirilebilirlik için @Data sunar
- Kalıtım: Records sınıfları genişletemez; Lombok sınıfları genişletebilir
- Derleme aracı bağımlılığı: Lombok ek açıklama işleyicisi kurulumu gerektirir; Records yerleşik olarak gelir
Records Ne Zaman Kullanılmalı
Records şu durumlarda idealdir:
- Tür öncelikle şeffaf bir veri taşıyıcısıysa (veri aktarım nesnesi, değer nesnesi)
- Tasarım gereği değişmezlik isteniyorsa
- Java 16 veya sonraki bir sürümü kullanıyor ve hiç bağımlılık istemiyorsanız
- Tür örüntü eşleştirmesine katılıyorsa (mühürlü türler + Records)
// 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 stateLombok Ne Zaman Kullanılmalı
Lombok şu durumlarda tercih edilir:
- Değiştirilebilir bean'lere ihtiyacınız varsa (ör. JPA varlıkları, Spring yapılandırma sınıfları)
- Çerçevelerle uyumluluk için erişimci adlandırmasının JavaBeans kuralını (
getX) izlemesi gerekiyorsa - Karmaşık nesne oluşturma için
@Buildergerekiyorsa - Kısmi değiştirilebilirlik gerekiyorsa (bazı alanlarda
@NonFinal)
// 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();Sıradan Sınıflar Ne Zaman Kullanılmalı
Sıradan sınıflar şu durumlarda hâlâ uygundur:
- Sınıf basit veri taşımacılığının ötesinde karmaşık davranışlara sahipse
- Başka bir sınıfı genişletmeniz gerekiyorsa
- hashCode/equals üzerinde ayrıntılı denetim gerekiyorsa
- Kapsülleme içeren değiştirilebilir duruma ihtiyaç varsa
// 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(); }
}Records ve Sınıfları Birlikte Kullanma
Records ve sınıflar sorunsuz biçimde birlikte çalışır. Değiştirilebilir durumu yöneten sınıfların içinde değişmez veriler için Records kullanın.
// 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();
}
}Spring Boot'ta Records
Records, istek ve yanıt gövdeleri olarak Spring Boot ile iyi bütünleşir. Spring'in Jackson eşleyicisi, çok az yapılandırmayla bunları işler.
// 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());
}
}Performans Karşılaştırması
Her üç yaklaşım da basit veri taşıyıcıları için temelde aynı bayt kodunu üretir. Performans aynıdır — seçim, geliştirici deneyimi ve gereksinimlerle ilgilidir.
// 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 moduleHızlı Kontrol
Record erişimcileri hangi adlandırma kuralını izler?
Özet: Records ve Sınıflar ve Lombok
Temel çıkarımlar:
- Records oluşturucuyu, erişimcileri (get ön eki olmadan), equals, hashCode ve toString yöntemlerini otomatik olarak üretir
- Records her zaman değişmezdir; değiştirilebilir durum için sıradan sınıflar kullanın
- Lombok @Value, Records davranışını yaklaşık olarak sağlar ancak getX() adlandırmasını kullanır ve kurulum gerektirir
- Lombok @Builder, çok sayıda isteğe bağlı alan içeren karmaşık nesne oluşturma işlemlerinde çok başarılıdır
- Records; veri aktarım nesneleri, değer nesneleri ve API istek/yanıt gövdeleri için idealdir
- Davranışın ön planda olduğu veya kalıtımın gerektiği durumlarda sıradan sınıflar hâlâ en iyi seçenektir
Sıkça Sorulan Sorular
“Record'lar, Sınıflar ve Lombok” dersi ücretsiz mi?
Evet — “Record'lar, Sınıflar ve Lombok” 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'lar, Sınıflar ve Lombok” dersinde ne öğreneceğim?
Doğru aracı seçmek için record'ları geleneksel sınıflarla ve Lombok ek açıklamalarıyla karşılaştırı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 4. dersidir.
“Record'lar, Sınıflar ve Lombok” 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
- Record'lara Giriş
- Kısa Yapıcılar ve Doğrulama
- Record'larda Özel Yöntemler
- Record'lar, Sınıflar ve Lombok