Giới thiệu
Project Lombok là một công cụ giúp chúng ta generate code một cách tự động nhưng không phải giống như các IDE làm. Các IDE generate các phương thức Getter, Setter và một số phương thức khác trong các tập tin .java. Project Lombok cũng generate các phương thức đó nhưng là trong các tập tin .class file.
Lombok được sử dụng để giảm mã cho các đối tượng model/ entity. Lombok sử dụng chú thích (annotation) để đánh dấu các phương thức cần generate. Ví dụ: @Getter được sử dụng để tạo gettter cho các field, @Setter để tạo setter cho các field, …
Cài đặt Project Lombok
Để các IDE có thể hiểu được code do Project Lombok generate ra, chúng ta cần cài đặt Project Lombok plugin cho chúng.
Download thư viện lombok
Truy cập vào địa chỉ: https://mvnrepository.com/artifact/org.projectlombok/lombok/1.16.20
Chọn download gói jar:
Cài đặt Project Lombok cho Eclipse, Spring Tool Suite, (Red Hat) JBoss Developer Studio, MyEclipse
Double click lên file lombok.jar đã download ở trên -> Lombok sẽ tìm tất cả các eclipse trên máy tính của bạn để setup, nếu không tìm thấy bạn có thể chọn Specify location … và xác định đường dẫn đến thư mục eclipse.
Nhấn Install/ Update để cài đặt lombok:
Lưu ý: Nếu bạn vẫn không thể install từ UI ở trên, bạn có thể mở file elipse.ini nếu sử dụng eclipse hoặc STS.ini nếu sử dụng Spring Tool Suite, … trong thư mục cài đặt. Bạn thêm vào cuối file lệnh sau:
-javaagent:[path_to_lombok_jar/]lombok.jar
Đối với MacOS, một vài trường hợp lombok không hoạt động, các bạn cần cấu hình theo các bước sau:
- Edit file: /Applications/Eclipse.app/Contents/Eclipse/eclipse.ini
<pre class="lang-java prettyprint prettyprinted">-Xbootclasspath/a:lombok.jar -javaagent:lombok.jar</pre>
- Paste lombok.jar vào folder: /Applications/Eclipse.app/Contents/MacOS/
- Restart Eclipse
- Chọn Project -> Clean
Cài đặt Project Lombok cho IntelliJ IDEA
Trên menu, chọn File > Settings > Plugins
Chọn Browse repositories… -> Tìm Lombok Plugin -> Nhấn Install plugin
Khởi động lại IntelliJ IDEA
Sử dụng Lombok trong Project Java
Tạo project Java sử dụng thư viện Project Lombok
Ngoài việc cài đặt Lombok cho IDE, bạn cần phải import thư viện này vào project của bạn.
Trong bài này, tôi sẽ tạo một Project Maven và khai báo thư viện lombok vào file pom.xml như sau:
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency>
Giới thiệu một số Annotation thường dùng của Project Lombok
@Getter/ @Setter: sẽ generate phương thức getter / setter cho các field.
- Nếu bạn sử dụng Annotation này trên class, lombok sẽ tạo ra getter/ setter cho tất cả các field của class.
- Nếu sử dụng trên field, lombok sẽ tạo getter/ setter chỉ cho field được đánh dấu.
- Mặc định lombok sẽ generate các field có phạm vi truy cập là public. Bạn có thể thay đổi phạm vi truy cập này bằng cách xác định AccessLevel. Ví dụ xác định setter của field name là protected: @Setter(AccessLevel.PROTECTED) private String name;
- Đôi khi bạn muốn generate getter/ setter tất cả các field của một class, nhưng loại từ một số field nhất định bằng cách xác định AccessLevel là NONE.
@ToString: sẽ generate phương thức toString().
@EqualsAndHashCode: sẽ generate phương thức hashCode() và equals().
@NoArgsConstructor: sẽ generate một hàm construct không có đối số.
@AllArgsConstructor: sẽ generate một hàm construct có đối số của tất cả field có trong class.
@Data: bao gồm các annotation @ToString, @EqualsAndHashCode, @Getter, @Setter.
@Builder: sẽ generate các phương thức để có thể khởi tạo một object theo Builder Pattern.
@Log: sẽ generate một log field thuộc lớp Logger.
- @Log: sẽ sử dụng logger của lớp java.util.logging.Logger.
- @Log4j: sẽ sử dụng logger của lớp org.apache.log4j.Logger.
- @Slf4j: sẽ sử dụng logger của lớp org.slf4j.Logger.
Ngoài ra còn các Annotation khác bạn có thể tham khảo tại: https://projectlombok.org/features/all
Sử dụng Project Lombok
Ví dụ lớp Student khi không sử dụng Project Lombok, sử dụng generate code được hỗ trợ sẵn bởi IDE, ta có kết quả sau:
package com.gpcoder.non_lombok; import java.util.Date; public class Student { private Long id; private String name; private String clazz; private Date birthday; public Student() { super(); } public Student(Long id, String name, String clazz, Date birthday) { super(); this.id = id; this.name = name; this.clazz = clazz; this.birthday = birthday; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((birthday == null) ? 0 : birthday.hashCode()); result = prime * result + ((clazz == null) ? 0 : clazz.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (birthday == null) { if (other.birthday != null) return false; } else if (!birthday.equals(other.birthday)) return false; if (clazz == null) { if (other.clazz != null) return false; } else if (!clazz.equals(other.clazz)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", clazz=" + clazz + ", birthday=" + birthday + "]"; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClazz() { return clazz; } public void setClazz(String clazz) { this.clazz = clazz; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
Cũng lớp Student ở trên, nhưng chúng ta sẽ sử dụng các Annotation của Project Lombok
package com.gpcoder.lombok; import java.util.Date; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Student { private Long id; private String name; private String clazz; private Date birthday; }
Bạn có thể mở cửa sổ Outline của Eclipse để xem lại kết quả:
Như bạn thấy, Lombok đã generate các phương thức đầy đủ như chúng ta generate bằng IDE.
Sử dụng AccessLevel với Getter và Setter trong Project Lombok
Như đã giới thiệu ở trên, mặc định lombok sẽ generate các field có phạm vi truy cập là public. Bạn có thể thay đổi phạm vi truy cập này bằng cách xác định AccessLevel.
Một số giá trị của enum AccessLevel:
- PUBLIC : genarate với phạm vi truy cập là public.
- PROTECTED : genarate với phạm vi truy cập là protected.
- PACKAGE : genarate với phạm vi truy cập là package.
- PRIVATE : genarate với phạm vi truy cập là private.
- NONE : không generate bất cứ gì.
Ví dụ tạo một lớp User với các yêu cầu sau:
- Các thông tin id, username, birthday, avatar, address, … có phạm vi truy cập là public.
- Thông tin password sẽ không cho phép xem (không có getter), chỉ cho phép cập nhật (có setter).
- Thông tin email có phạm vi truy cập là protected.
package com.gpcoder.lombok; import java.util.Date; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @Getter @Setter public class User { private Long id; private String username; @Getter(AccessLevel.NONE) private String password; @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) private String email; private Date birthday; private String avatar; private String address; }
Các phương thức được Lombok generate như sau:
Builder Pattern với @Builder trong Project Lombok
Builder Pattern là một mẫu thiết kế được sử dụng để xây dựng một đối tượng phức tạp bằng cách sử dụng các đối tượng đơn giản và sử dụng tiếp cận từng bước.
Ví dụ tạo đối tượng UserProfile bằng cách sử dụng hàm contruct theo cách truyền thống:
package com.gpcoder.lombok.builder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @AllArgsConstructor @ToString public class UserProfileEntity { private String name; private String language; private int experience; }
Với Project Lombok, chúng ta có thể dễ dàng tạo đối tượng UserProfile theo Builder Pattern bằng cách sử dụng annotation @Builder như sau:
package com.gpcoder.lombok.builder; import lombok.Builder; import lombok.ToString; @Builder @ToString public class UserProfileBuilder { private String name; private String language; private int experience; }
Hãy xem cách sử khởi tạo của 2 cách trên:
package com.gpcoder.lombok.builder; public class App { public static void main(String[] args) { UserProfileEntity entity = new UserProfileEntity("gpcoder", "Java", 5); System.out.println(entity); UserProfileBuilder builder = UserProfileBuilder.builder() .name("gpcoder") .language("Java") .experience(5) .build(); System.out.println(builder); } }
Trên đây là những giới thiệu cơ bản về sử dụng Project Lombok trong Java. Chương trình sử dụng Annotation của lombok sẽ đơn giản hơn rất nhiều, khi bạn thay đổi field, thêm, field, … bạn không cần phải update lại bằng tay các phương thức nữa, lombok sẽ tự động generate lại các phương thức cho chúng ta.
Cám ơn các bạn đã quan tâm và theo dõi bài viết. Hy vọng bài viết này giúp ích được cho các bạn, hẹn gặp lại ở các bài viết tiếp theo.