Lombok
Lombok Nedir ?
Lombok , Java programlamada geliştirme yaparken IDE’ye entegre edilebilen bir annotation ile code generation sağlayan kütüphanedir.Lombok sayesinde daha okunabilir kod yazılması sağlanır.
Java’da geliştirme yaparken sık kullandığımız bazı işlemler bulunmaktadır.Bu işlemler doğrudan son kullanıcı da değer yaratmazken kodumuz arasında çok fazla ayrıntı bulunmasına neden olmaktadır.
Konunun daha net anlaşılabilmesi için bir POJO’da (Plain Old Java Object) uygulamasında sürekli klasikleşmiş Get-Set , Constructor, toString methodları yazmamız gerekir.Bu şekilde kendini tekrar eden kodlar yazarak clean code prensibinden uzaklaşmış oluyoruz.
Lombok 2 türlü branch mantığı ile geliştirilmektedir.
Stable : Dünya üzerinde kabul görmüş ve aktif olarak kullanılan annotation’lardır.
Experimental :Beta sürümü olarak adlandırabileceğimiz geliştirmesi devam eden annotation’lardır.
Annotation , proje compile olduğu anda code genaration ederek çalışma prensibine dayanır.
Lombok javanın annotation processing özelliği kullanılarak compiler geliştirilmiştir.
Lombok Projeye Nasıl Entegre Edilir ?
- Intellij IDEA : Intellij içerisine lomboku entegre etmek için lombok plugini yüklemek ve editörü restart etmek yeterli olacaktır.Bu aşamadan sonra tek yapılması gereken pom.xml dosyasına aşağıdaki bağımlılığı eklemektir.
- Eclipse : Pom.xml dosyasına dependency eklenmelidir.Ardından local maven repodan ilgili jar bulunmalı ve çalıştırılmalıdır.Bunun sonucunda lombok Ide bulamadım uyarısı verecektir.Bu uyarı sonrasında Installer’da kullandığımız eclipse dizini verilerek install edilir.
- Konunun daha net anlaşılabilmesi örnek üzerinden inceleyelim.Bir POJO java sınıfı oluşturalım.Sınıfımızn adı Book olsun.Bu sınıfa ait dört tane field olsun.Bu fieldların getter ve setter methodlarını yazalım ve constructor’ını ekleyelim.
public class Book {private String bookName;private String writer;private String description;private int numberOfPage;public Book(String bookName, String writer, String description, int numberOfPage) {super();this.bookName = bookName;this.writer = writer;this.description = description;this.numberOfPage = numberOfPage;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getWriter() {return writer;}public void setWriter(String writer) {this.writer = writer;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public int getNumberOfPage() {return numberOfPage;}public void setNumberOfPage(int numberOfPage) {this.numberOfPage = numberOfPage;}
Oluşturduğumuz sınıfa ait özelliklere değerler set ederek bu özellikleri bir main class içerisinde yazdıralım.
public class MainClass {public static void main(String[] args) {Book book = new Book("Nutuk", "Mustafa Kemal Atatürk", "Biyografi", 543);System.out.println(book.getBookName() + " " + book.getWriter() + " " + book.getDescription() + " "+ book.getNumberOfPage()); }
}
Bu main methodunu çalıştırdığımızda book nesnesine atadığımız değerleri göreceğiz.
Bu uygulamada yaptığımız işlemi Lombok annotationları ile yapalım.
Projemiz içerisine oluşturduğumuz Getter/Setter methodlarını silelim ve Lombok kütüphanesinin @Getter ve @Setter annotation’ı ekleyelim.
public class Book {@Getter @Setter private String bookName;@Getter @Setter private String writer;@Getter @Setter private String description;@Getter @Setter private int numberOfPage;public Book(String bookName, String writer, String description, int numberOfPage) {super();this.bookName = bookName;this.writer = writer;this.description = description;this.numberOfPage = numberOfPage; }}
Bu annotation ile sınıf içerisindeki yazmış olduğumuz @Getter/Setter methodlarından arınmış oluyoruz.
Bu işlemlerin ardından kullandığımız constructor’dan da kurtulabiliriz.Lombok’un bize sunmuş olduğu @AllArgsConstructor annotation işaretleyerek bu işlemi deneyelim.
@AllArgsConstructorpublic class Book {@Getter @Setter private String bookName;@Getter @Setter private String writer;@Getter @Setter private String description;@Getter @Setter private int numberOfPage;}
Bu şekilde constructor’ımızı düzenlediğimizde de aynı çıktıyı alacağız.
Lombok kütüphanesinin bize sunmuş olduğu önemli annotation’lardan bir tanesi de @Data annotationdır.Book class’ı içerisindeki propertyleri tek tek @Getter/Setter olarak işaretlemiştik.Bunun yerine @Data annotation kullanarak class genelinde bu işlemi gerçekleştirebiliriz.
@AllArgsConstructor@Datapublic class Book {private String bookName;private String writer;private String description;private int numberOfPage;}
Annotation’ların bir çoğu field başına ya da sınıf üzerinde tanımlanabilir.Sınıf üzerine eklediğimiz annotation’dan field’ın etkilenmemesini istiyorsak erişime kapatabiliriz.
@AllArgsConstructor@Datapublic class Book {private String bookName;@Setter(AccessLevel.Private)
private String writer;private String description;private int numberOfPage;}
Lombok Kullanmanın Avantajları -Dezavantajları
- Geliştirme maaliyetini düşürür.Zaman kazanılmasını sağlar.
- Clean code geliştirmeye yardımcı olur.
- Lombok opensource’dur.
- Code okunurluğunu düşürür.Debug yapmak zorlaşabilir.
- Kurulum için IDE plugine ihtiyaç duyar.
Lombok Annotation’larını özetleyecek olursak ;
@Getter : Ait olduğu alanın get methodunu oluşturulmuş olur.
@Setter: Annotation olduğu fieldin setter methodunu oluşturur.
@Data : Sınıf içerisindeki getter/setter ve ToString methodları oluşturur.
@AllArgsConstructor : Sınıf için üretilmesi gereken constructorın oluşmasını sağlar.
@NoArgsConstructor : Nesnenin boş constructor’ını döner.Instance oluşturur.
@RequiredArgsConstructor : Başlangıç değeri olduğunda bu constructor kullanılır.
@NonNull : Null gelen değer için NullPointerException fırlatmayı sağlar.
@ToString : Bean’in ToString methodunu bizim için oluşturur.ToString(of =id) ile parametre vererek işlem yapabiliriz.
@EqualsAndHashCode : İki nesnenin eşit olup olmadığını kontrol eder. ToString ‘de olduğu gibi (of) parametresi ile hangi field’a bakacak karar verir.
@Builder : Design pattern implement edilmesini sağlar.
@UtilityClass : Utility classlarda kullanılır.Örneğin trim adında bir method olsun ve aldığı değeri parse edip geri dönsün.Utility class final olmalı ve içindeki trim() methodu da static olmalıdır.Bu annotation ile bu zorunluluk ortadan kalkmış olur.
“Daha az kod yazmak , esnek kalmanın en güzel yoludur.”