我一直打算写关于 Project Lombok 的文章,以至于当每个有自尊心的 Java 开发人员都已经听说过它时,我可能正在写这篇文章。尽管如此,值得一提的是,如果只是提醒自己应该毫不犹豫地尝试性能增强工具并看看它们是否合适,Lombok 肯定会通过允许以下方式增强 Java 编码器的性能同时编写更少的代码并提高其质量,这不是一件小事。
Java 的反对者通常会说它的弱点是什么?
Java 太冗长了。 (c) 每个 Java 对手
不幸的是,这句话有很多道理。想象一个简单的数据类,你想要存储个人信息——姓名、年龄等。它可能看起来像这样。
public class PersonSimple { private String lastName; private String firstName; private Integer age; public String getLastName() { return lastName; } public String getFirstName() { return firstName; } public Integer getAge() { return age; } public void setLastName(String lastName) { this.lastName = lastName; } public void setFirstName(String firstName) { this.firstName = firstName; } public void setAge(Integer age) { this.age = age; } }
好吧,你说。我用 IDE 生成了所有这些东西,并不难。但我们还需要一个 hashCode() 和 equals()。因为您可能希望将实例保留在集合中并检查是否相等。没问题,大多数 IDE 都允许您生成这些以及 getter 和 setter。他们会加入一个 toString() 生成器来帮助您输出对象并查看其中的内容。
public class PersonSimple { private String lastName; private String firstName; private Integer age; public String getLastName() { return lastName; } public String getFirstName() { return firstName; } public Integer getAge() { return age; } public void setLastName(String lastName) { this.lastName = lastName; } public void setFirstName(String firstName) { this.firstName = firstName; } public void setAge(Integer age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PersonSimple that = (PersonSimple) o; return Objects.equals(lastName, that.lastName) && Objects.equals(firstName, that.firstName) && Objects.equals(age, that.age); } @Override public int hashCode() { return Objects.hash(lastName, firstName, age); } @Override public String toString() { return "PersonSimple{" + "lastName='" + lastName + '\'' + ", firstName='" + firstName + '\'' + ", age=" + age + '}'; } }
那好吧。所有这些东西都是由 IntelliJ IDEA 生成的。没那么难吧?好吧,不。但是现在您正在考虑 Josh Bloch 并决定应用 Builder 模式。这一次,你必须做一些手工工作。你最终可能拥有的将是接近于此的东西。
public class PersonSimple { private final String lastName; private final String firstName; private final Integer age; private PersonSimple(String lastName, String firstName, Integer age) { this.lastName = lastName; this.firstName = firstName; this.age = age; } public String getLastName() { return lastName; } public String getFirstName() { return firstName; } public Integer getAge() { return age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PersonSimple that = (PersonSimple) o; return Objects.equals(lastName, that.lastName) && Objects.equals(firstName, that.firstName) && Objects.equals(age, that.age); } @Override public int hashCode() { return Objects.hash(lastName, firstName, age); } @Override public String toString() { return "PersonSimple{" + "lastName='" + lastName + '\'' + ", firstName='" + firstName + '\'' + ", age=" + age + '}'; } public static class Builder { private String lastName; private String firstName; private Integer age; public Builder setLastName(String lastName) { this.lastName = lastName; return this; } public Builder setFirstName(String firstName) { this.firstName = firstName; return this; } public Builder setAge(Integer age) { this.age = age; return this; } public PersonSimple build() { return new PersonSimple(lastName, firstName, age); } } }
所以。我们有一个构建器,现在我们的 PersonSimple 可以用这样的一段代码创建。
final PersonSimple john = new Person.Builder() .setFirstName("John") .setLastName("Doe") .setAge(30) .build(); System.out.println(john);
但是你必须创造很多东西。你有:
该代码现在需要 70 多行。每次您需要一个新字段时,您都必须至少在三个地方处理它——数据类中的 getter、构建器类中的 setter 和构造函数。
如果我向您展示如何使用 Project Lombok 做同样的事情会怎么样?
好的,开始吧。
@Builder(toBuilder = true) @ToString @EqualsAndHashCode @AllArgsConstructor(access = AccessLevel.PRIVATE) public class Person { @NonNull @Getter private final String lastName; @NonNull @Getter private final String firstName; @NonNull @Getter private final Integer age; }
现在是十五行代码。十五!我们刚刚将代码减少了五次。对于有很多领域的班级来说,增益会更好。
那么,Project Lombok 到底做了什么?它会在编译期间生成所有样板文件,让您避免手动编写代码或使用 IDE 生成代码。它为您节省了大量时间,并允许您以更少的努力创建更漂亮的代码。
在你的代码 lombokization 之后,这个人可以像这样创建。
private static Person JOHN = Person.builder() .firstName("John") .lastName("Doe") .age(30) .build();
要将 Lombok 添加到您的项目中,您需要为它添加一个依赖项,并且在我的例子中为 IDEA 安装一个 Lombok 插件。 此处 和 Maven 此处 描述了 Gradle 配置。
这里描述了 Lombok 的所有特性。请看一下,看看是否还有其他有用的东西,因为我在这里描述的只是它所拥有的一小部分。
示例中的代码存储在我的 github 存储库中。
祝你代码干净简洁!
标签2: Java教程地址:https://www.cundage.com/article/jcg-write-less-better-code-project-lombok.html