Lombok 使用小結


目錄

Lombok 使用小結

Lombok 簡介

Lombok 是一種 Java 實用工具,可用來幫助開發人員消除 Java 的冗長,尤其是對於簡單的 Java 對象(POJO)。它通過注釋實現這一目的。通過在開發環境中實現 Lombok,開發人員可以節省構建諸如 hashCode() 和 equals() 、getter / setter 這樣的方法以及以往用來分類各種 accessor 和 mutator 的大量時間。

Lombok 安裝

使 IntelliJ IDEA 支持 Lombok 方式如下:

(1)Intellij 設置支持注解處理

點擊 File > Settings > Build > Annotation Processors

勾選 Enable annotation processing

(2)安裝插件

點擊 Settings > Plugins > Browse repositories

查找 Lombok Plugin 並進行安裝

重啟 IntelliJ IDEA

(3)將 lombok 添加到 pom 文件

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version> </dependency>

Lombok 使用

API

Lombok 提供注解 API 來修飾指定的類:

@Getter and @Setter

@Getter and @Setter Lombok 代碼:

@Getter @Setter private boolean employed = true; @Setter(AccessLevel.PROTECTED) private String name;

等價於 Java 源碼:

private boolean employed = true; private String name; public boolean isEmployed() { return employed; } public void setEmployed(final boolean employed) { this.employed = employed; } protected void setName(final String name) { this.name = name; }

@NonNull

@NonNull Lombok 代碼:

@Getter @Setter @NonNull private List<Person> members;

等價於 Java 源碼:

@NonNull private List<Person> members; public Family(@NonNull final List<Person> members) { if (members == null) throw new java.lang.NullPointerException("members"); this.members = members; } @NonNull public List<Person> getMembers() { return members; } public void setMembers(@NonNull final List<Person> members) { if (members == null) throw new java.lang.NullPointerException("members"); this.members = members; }

@ToString

@ToString Lombok 代碼:

@ToString(callSuper=true,exclude="someExcludedField") public class Foo extends Bar { private boolean someBoolean = true; private String someStringField; private float someExcludedField; }

等價於 Java 源碼:

public class Foo extends Bar { private boolean someBoolean = true; private String someStringField; private float someExcludedField; @java.lang.Override public java.lang.String toString() { return "Foo(super=" + super.toString() + ", someBoolean=" + someBoolean + ", someStringField=" + someStringField + ")"; } }

@EqualsAndHashCode

@EqualsAndHashCode Lombok 代碼:

@EqualsAndHashCode(callSuper=true,exclude={"address","city","state","zip"}) public class Person extends SentientBeing { enum Gender { Male, Female } @NonNull private String name; @NonNull private Gender gender; private String ssn; private String address; private String city; private String state; private String zip; }

等價於 Java 源碼:

public class Person extends SentientBeing { enum Gender { /*public static final*/ Male /* = new Gender() */, /*public static final*/ Female /* = new Gender() */; } @NonNull private String name; @NonNull private Gender gender; private String ssn; private String address; private String city; private String state; private String zip; @java.lang.Override public boolean equals(final java.lang.Object o) { if (o == this) return true; if (o == null) return false; if (o.getClass() != this.getClass()) return false; if (!super.equals(o)) return false; final Person other = (Person)o; if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false; if (this.gender == null ? other.gender != null : !this.gender.equals(other.gender)) return false; if (this.ssn == null ? other.ssn != null : !this.ssn.equals(other.ssn)) return false; return true; } @java.lang.Override public int hashCode() { final int PRIME = 31; int result = 1; result = result * PRIME + super.hashCode(); result = result * PRIME + (this.name == null ? 0 : this.name.hashCode()); result = result * PRIME + (this.gender == null ? 0 : this.gender.hashCode()); result = result * PRIME + (this.ssn == null ? 0 : this.ssn.hashCode()); return result; } }

@Data

@Data Lombok 代碼:

@Data(staticConstructor="of") public class Company { private final Person founder; private String name; private List<Person> employees; }

等價於 Java 源碼:

public class Company { private final Person founder; private String name; private List<Person> employees; private Company(final Person founder) { this.founder = founder; } public static Company of(final Person founder) { return new Company(founder); } public Person getFounder() { return founder; } public String getName() { return name; } public void setName(final String name) { this.name = name; } public List<Person> getEmployees() { return employees; } public void setEmployees(final List<Person> employees) { this.employees = employees; } @java.lang.Override public boolean equals(final java.lang.Object o) { if (o == this) return true; if (o == null) return false; if (o.getClass() != this.getClass()) return false; final Company other = (Company)o; if (this.founder == null ? other.founder != null : !this.founder.equals(other.founder)) return false; if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false; if (this.employees == null ? other.employees != null : !this.employees.equals(other.employees)) return false; return true; } @java.lang.Override public int hashCode() { final int PRIME = 31; int result = 1; result = result * PRIME + (this.founder == null ? 0 : this.founder.hashCode()); result = result * PRIME + (this.name == null ? 0 : this.name.hashCode()); result = result * PRIME + (this.employees == null ? 0 : this.employees.hashCode()); return result; } @java.lang.Override public java.lang.String toString() { return "Company(founder=" + founder + ", name=" + name + ", employees=" + employees + ")"; } }

@Cleanup

@Cleanup Lombok 代碼:

public void testCleanUp() { try { @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos.write(new byte[] {'Y','e','s'}); System.out.println(baos.toString()); } catch (IOException e) { e.printStackTrace(); } }

等價於 Java 源碼:

public void testCleanUp() { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { baos.write(new byte[]{'Y', 'e', 's'}); System.out.println(baos.toString()); } finally { baos.close(); } } catch (IOException e) { e.printStackTrace(); } }

@Synchronized

@Synchronized Lombok 代碼:

private DateFormat format = new SimpleDateFormat("MM-dd-YYYY"); @Synchronized public String synchronizedFormat(Date date) { return format.format(date); }

等價於 Java 源碼:

private final java.lang.Object $lock = new java.lang.Object[0]; private DateFormat format = new SimpleDateFormat("MM-dd-YYYY"); public String synchronizedFormat(Date date) { synchronized ($lock) { return format.format(date); } }

@SneakyThrows

@SneakyThrows Lombok 代碼:

@SneakyThrows public void testSneakyThrows() { throw new IllegalAccessException(); }

等價於 Java 源碼:

public void testSneakyThrows() { try { throw new IllegalAccessException(); } catch (java.lang.Throwable $ex) { throw lombok.Lombok.sneakyThrow($ex); } }

示例

使用 Lombok 定義一個 Java Bean

import lombok.Data; import lombok.ToString; @Data @ToString(exclude = "age") public class Person { private String name; private Integer age; private String sex; }

測試

Person person = new Person(); person.setName("張三"); person.setAge(20); person.setSex("男"); System.out.println(person.toString()); // output: Person(name=張三, sex=男)

示例源碼

完整示例:源碼

引用和引申

引申

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM