Java Records vs Lombok — Hangisi Avantajlı

Said Özgat
3 min readDec 16, 2023

--

Selamlar, yeni yazımızda Java 14 ile birlikte hayatımıza giren Recordlar ile Lombok’u karşılaştıracağız. Örnek kodlarla detaylıca anlatmaya çalışacağım. Hadi başlayalım.

Java 14 Record

Java 14 ile Record diye yeni bir özellik duyuruldu. Nedir bu record diyecek olursanız; Data classlarımızı daha temiz ve basit hale getirmektedir. Yani Constructor, Getter, Setter gibi metotlardan kurtulmamıza yardımcı olup, daha sade bir class görünümü sağlıyor. Asıl amaçları bir tür veri tutucusu gibi çalışmaktır. Record nesneleri bir kez oluşturulduktan sonra nesne içeriği değiştirilemeyen sınıflardır.

Hemen bir örnek yapalım:

public record Customer(String msisdn, String name, String surname) { }

Sadece 1 satır kod yazarak nelere mi sahip olduk:

  • Her bir field private final olarak tanımlanır
  • Tüm fieldları kapsayan constructorumuz olur
  • Her bir field için getter metodumuz olur
  • equals(), hashCode(), and toString() methodları tanımlanır

Minik bir kod ile data işlemleri için birçok özelliğe sahip olduk.

Lombok Nedir?

Şimdiyse lombok’a bakalım. Muhtemelen bir çoğunuz lombok kullanmıştır veya duymuştur. Getter, Setter, Constructor vb. bütün kod kalabalığını class’dan kaldırıp derleme zamanına bırakan bunun için birçok anotasyon sağlayan bir kütüphanedir.

Yukarıdaki Customer class’ını lombok kullanarak oluşturalım:

import lombok.Data;

@Data
public class Customer {
private final String msisdn;
private final String name;
private final String surname;
}

@Data anotasyonu ile lombok bize şunları sağlıyor:

  • Bütün fieldler için getter metotları oluşturulur
  • Final olmayan fieldler için setter metotları oluşturulur
  • equals(), hashCode(), and toString() methodları tanımlanır

Lombok bize farklı anotasyonlar ile esneklik sağlar. Örneğin @Builder anotasyonu ile Builder pattern kullanabiliriz. Builder pattern’i recordlar sağlayamayaz. Ama unutmayın, lombok kullanmak için lombok kütüphanesini projenize eklemeniz gerekiyor. Recordlarda ise kütüphane bağımlılığınız yok.

Java 14 Record vs Lombok — Karşılaştıralım?

Yukarıda kısaca Java 14 Record ve Lombok’u özetledik. Sırada bize sağladıkları avantajlardan ve dezavantajlardan bahsetme zamanı. Bakalım sonuçta kim kazanacak?

Temiz ve Anlaşılır Class Yapısı

Hem Lombok hem de Recordlar temiz ve anlaşılır bir class yapısı sağlıyor. Lombok anotasyonlarla birlikte bir çok özelliği ve patterni bize sağlıyor. Bununla birlikte Record ise basitlik ve okunabilirlik açısından bence avantajlı. Record olan bir sınıfa baktığınızda kolayca anlayabilirsiniz. Ancak Lombok’ta farklı farklı anotasyonlar kullanıldığında bu neden burada kullanılmış, ne işe yarıyor vs gibi karmaşaya yol açabiliyor. Ek olarak şunu belirtmeliyim, recordlarda çok fazla field olan bir classta, örneğin 10–15 field, constuructor’a değerleri setlemek epey karmaşık olacaktır. Böyle de negatif bir yönü var. Burada Lombok @Builder ile kolayca gerekli bilgileri setleyebiliriz.

Immutability (Değiştirilimez Nesne)

Recordlar default olarak immutabledir. Yani sınıf tüm fieldları dolaylı olarak final olarak bildirildiği için fieldlara özel setter oluşturulmaz. ValueObjects* gibi diyebiliriz. Setterları yoktur ve tüm değerler constructor üzerinden verilir. Lombokta ise @Value anotasyon ile aynısını yapabiliriz.

Bağımlılıklar

Lombok kullanabilmek için Lombok kütüphanesini projeye dahil etmeniz gerekiyor. Record ise Java’nın bir parçası, ekstra bir kütüphaneye gerek kalmıyor. Burada farklı görüşlerde olsa, projeye ne kadar fazla kütüphane dahil edersek bağımlılığımız o kadar artıyor. İleride bize fazla bakım maliyetleri çıkartabilirler. Bundan dolayı bu maddeyi kazanan Record.

Esneklik

Daha öncede söylediğim gibi Lombok birçok özelliği içerisinde barındıyor. @Builder ile builder pattern, @Slf4j ile loglama vs. Recordlarda bu tarz özellikler yoktur. Verileri tutmaktan çok daha fazlasına ihtiyacınız varsa, Lombok burada daha iyi bir tercih olacaktır.

Kalıtım (Inheritance)

Record sınıfları şimdilik kalıtımı desteklemiyor. Bu durum modellerinizi tasarlarken sınırlı olmanıza neden olabilir. Lombok ise kalıtım destekliyor.

Karar Aşaması

Java 14 Record mu yoksa Lombok mu? Bu aslında tamamen sizin ihtiyaçlarınıza bağlı bir durum. Classlarda sadece verilerle basitçe işlemler yapayım diyorsanız bağımlılık ihtiyacı olmayan Recordları kullanın ama bana daha fazlası lazım diyorsanız Lombok tercih etmeniz daha doğru olacaktır.

En azından her ikisi de bizlere daha okunaklı kod sunarak, karmaşadan kurtarıyor. Hoşçakalın, iyi kodlamalar.

Referanslar:

https://www.baeldung.com/java-record-vs-lombok

https://stackoverflow.com/questions/61306802/lombok-getter-setter-vs-java-14-record

*ValueObjects: Yazılım uygulamalarında belirli bir değeri temsil etmek ve bu değer üzerinde işlemler yapmak için kullanılan bir tasarım desenidir. Değer nesneleri (Value Object’ler), genellikle değiştirilemez (immutable) ve kimliksizdir; yani içinde bulundurdukları değerlerle tanımlanırlar.

--

--