Project Lombok Nedir ?
Java projelerinde standart olarak yazılması gereken kod parçacıkları vardır. ( getter, setter, constructor, toString, equal, hashcode vb.) Java dilinin en sık dile getirilen eleştirilerinden biri, çoğu projede bulunan bu tür kodların hacmidir. Kullandığımız IDE’ler sayesinde hızlıca getter-setterları, toString vs. metotlarını oluşturabiliyoruz. Peki ya okunabilirlik ?
Project Lombok, gereksiz satır sayısı fazlalığından kurtarmak, okunabilirliği arttırmak ve daha temiz kod vaatleriyle ortaya çıkmıştır. Pragmatik geliştirici için güçlü bir araçtır. Java sınıflarınızdaki bol miktarda standart kodu ortadan kaldırmak için bir dizi faydalı anotasyon sunar. En iyi durumlarda, yüzlerce satırlık kodun yerini sadece beş satır alabilir.
Project Lombok, Java sınıfları için genel olarak yazılan standart kodların miktarını azaltmak için kullanılabilecek küçük bir kütüphanedir.
Kurulumu
Projemizde Lombok kullanmak için pom.xml’e bağımlılığı tanımlamamız gerekmektedir.
1 2 3 4 5 6 7 8 |
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </dependency> </dependencies> |
En güncel sürümü buradan kontrol edebilirsiniz.
Ayrıca kullandığınız IDE’ye de Lombok plugin’i yüklemek gerekmektedir.
Lombok Anotasyonları
@Getter ve @Setter
Kapsülleme(Encapsulation) konumuzda da bahsetmiştik bir sınıfın kapsülledikten sonra dış dünyaya getter setterlar ile açarız. Lombok bunları aynı ismi taşıyan anotasyonlarla kendisi yapmaktadır. Bunun iki yolu vardır; ya sınıf seviyesinde tüm alanların ya da alan seviyesinde tek tek kendiniz erişim seviyesini belirtip getter setterları oluşturabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 |
@Getter @Setter public class User { private String firstName; @Getter(AccessLevel.PACKAGE) private String lastName; private int age; } |
@NonNull
Alanlarımız üzerinde null kontrolü yapmaktadır ve eğer null setleniyor ise NullPointerException fırlatılmasını sağlıyor.
1 2 3 4 5 6 |
@NonNull private String firstName; Exception in thread "main" java.lang.NullPointerException: firstName at com.koraypeker.User.setFirstName(User.java:9) at Test.main(Test.java:8) |
@ToString
ToString anotasyonu, sınıf seviyesinde toString metodunu oluşturmaktadır. Hangi alanları içermesi gerektiği, hangi alanların kullanmayacağını parametre olarak geçebiliyorsunuz.
1 |
@ToString(exclude = {"age"}) |
@EqualsAndHashCode
Bu anotasyon, sınıf seviyesinde hem equals() hem de hashCode() metotlarını oluşturmaktadır. ToString anotasyonunda olduğu gibi parametrelerle sınıf alanlarını dahil veya hariç yapabilirsiniz.
1 |
@EqualsAndHashCode(exclude = {"age"}) |
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
Bu anotasyonlar, yapılandırıcıları(Constructor) oluşturmadır. NoArgs ile parametresiz, requiredArgs ile @NonNull anotasyonu ile işaretlediğiniz alanlara göre, AllArgs ise tüm alanlar ile constructor oluşturur.
@Data
Bu anotasyonumuz ise Lombok içerisinde en çok kullanılan anotasyondur. @ToString, @EqualsAndHashCode, @Getter ve @Setter işlevlerini birleştirir. POJO sınıflarının bolca kullandığı anotasyondur.
Öncesi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
public class User { private String firstName; private String lastName; private int age; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; if (age != user.age) return false; if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) return false; return lastName != null ? lastName.equals(user.lastName) : user.lastName == null; } @Override public int hashCode() { int result = firstName != null ? firstName.hashCode() : 0; result = 31 * result + (lastName != null ? lastName.hashCode() : 0); result = 31 * result + age; return result; } @Override public String toString() { return "User{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", age=" + age + '}'; } |
Sonrası
1 2 3 4 5 6 7 8 |
@Data public class User { private String firstName; private String lastName; private int age; } |
@Builder
Eğer Builder tasarım şablonunu kullanmak istiyorsanız sadece bu anotasyonu sınıf seviyesinde koymanız yeterlidir. Builder tasarım şablonunu daha iyi anlamak için buradan yazımı okuyabilirsiniz.
1 2 |
@Builder public class User { |
1 2 3 4 5 6 |
public class Test { public static void main(String[] args) { User user = User.builder().age(30).firstName("Koray").lastName("Peker").build(); } } |
@Slf4j @Log @CommonsLog @Log4j @Log4j2 @XSlf4j
Projenizde kullandığınız loglama mekanızmasına göre ilgili anotasyon ile sınıflarınızı işaretleyebilirsiniz. Bu sayede her sınıf içerisinde logger nesnesi oluşturmaya gerek olmayacaktır.
1 2 3 4 5 6 7 8 |
@Log4j public class Test { public static void main(String[] args) { log.info("Selam"); } } |
Bunun gibi daha bir çok anotasyon bulunmaktadır. https://projectlombok.org/features/ adresinden anotasyonları inceleyebilirsiniz.
Lombok’u uygulamalarınızdan birine eklemeyi deneyin ve kod satırlarının ne kadar azaldığını görün.
Çok faydalı bir yazı olmuş, teşekkürler.
Faydalı olmasına çok sevindim elif