我长期以来一直打算撰写有关Lombok项目的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它。 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能增强工具并查看它们是否合适, Lombok肯定会通过允许同时编写更少的代码并添加到Java中来增强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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(lastName, firstName, age);}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(lastName, firstName, age);}@Overridepublic 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);

但是您必须创建很多东西。 你有:

  • 具有全参数私有构造函数的数据类;
  • 数据类的三个获取器;
  • 带有三个二传手的伴随的建造者课程;
  • 生成器类上的build()方法,该方法调用私有数据类的构造函数;
  • 尽管生成了hashCode(),equals()和toString()方法,但不要忘记。

该代码现在需要70多行。 每次需要一个新字段时,都必须至少在三个地方进行处理:数据类中的getter,构建器类中的setter和构造函数。

如果我要向您展示如何对Lombok项目做同样的事情怎么办?

好,去

@Builder(toBuilder = true)
@ToString
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Person {@NonNull@Getterprivate final String lastName;@NonNull@Getterprivate final String firstName;@NonNull@Getterprivate final Integer age;
}
  • 我们使用@Builder注释生成了构建器类。 toBuilder = true意味着我们另外创建了一个toBuilder()实例方法,该方法创建一个builder类的新实例,并使用当前实例中的值进行初始化。
  • 我们添加了带有@ToString批注的toString()方法。
  • 我们添加了hashCode()equals()以及@EqualsAndHashCode
  • 我们使用@AllArgsConstructor(access = AccessLevel.PRIVATE)将所有参数的构造函数设为私有。
  • 我们使用@Getter注释在类字段中添加了标准的获取方法

现在是十五行代码。 十五! 我们只是将代码减少了五次。 对于具有很多领域的课程而言,收益会更好。

那么, Lombok计划到底做什么? 在编译期间生成所有样板 ,从而使您避免手动编写该代码或使用IDE生成它。 它为您节省了大量时间,并允许您以更少的精力创建更漂亮的代码。

将您的代码打包后,可以像这样创建人。

private static Person JOHN = Person.builder().firstName("John").lastName("Doe").age(30).build();

要将Lombok添加到您的项目中,您需要为其添加一个依赖项,在本例中,还需要为IDEA安装一个Lombok插件 。 这里描述了 Gradle配置, 这里描述了 maven。

这里描述了Lombok的所有功能 。 请看一下是否还有其他有用的内容,因为我在这里描述的内容只是其中的一小部分。

来自示例的代码存储在我的github存储库中 。

祝您代码简洁明了!

翻译自: https://www.javacodegeeks.com/2018/01/write-less-better-code-project-lombok.html

如何编写更少,更好的代码,或Project Lombok相关推荐

  1. 精要主义:更少但要更好

    精要主义:更少但要更好 不是提倡做更多的事,而是做对的事 时间只用于有意义的事: -克服根深蒂固的想法:我必须做,我都要完成,我能二者兼顾 -我选择做,我可以做任意而不是所有的事,只有小部分的事是重要 ...

  2. lombok 简化代码_如何编写更少,更好的代码,或Project Lombok

    lombok 简化代码 我长期以来一直打算写有关Lombok的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它. 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能 ...

  3. Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回

    在上一篇有关Lombok库的文章中 ,我描述了一个库,该库有助于处理Java中的样板代码( 是的,我知道这些问题已经在Kotlin中解决了 ,但这是现实生活,我们不能一味地坐下来,一旦出现较新或更简单 ...

  4. 单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试

    单元测试junit参数 大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们. 而且,大多数人不喜欢在他们从事的项目中编写单元测试. TDD的人当然处于另一面,但根据我的经验,他们 ...

  5. 如何编写更高层次嵌入式C代码?

    如何编写更高层次嵌入式C代码? 1. 简介 2. C语言特性 2.1处处都是陷阱 2.1.1 无心之过 2.1.2 数组下标 2.1.3 容易被忽略的break关键字 2.1.4 意想不到的八进制 2 ...

  6. SpringMVC集成Hibernate Validator进行注解式的参数校验——让代码更少、更加专注于业务逻辑

    SpringMVC集成Hibernate Validator进行注解式的参数校验 --让代码更少.更加专注于业务逻辑 1 问题背景: 参数验证是一个常见的问题,例如验证用户输入的密码是否为空.邮箱是否 ...

  7. azure上传代码_深入了解Azure Data Studio:更多代码和更少GUI

    azure上传代码 In the previous two articles, Starting your journey with Azure Data Studio and Developing ...

  8. 低代码的兴起:花更少的钱,赚更多的钱

    "低代码"或"无代码"应用程序并不新鲜.事实上,它们已经存在了几十年,但直到最近几年才成为主流. 作者 | Clay Norris 编译 | 风车云马 责编 | ...

  9. 耗电更少,苹果 M1 编译代码速度与 2019 年 Mac Pro 一样快

    近期苹果自研M1处理器讨论度非常高,我们已经看到了许多基准测试结果和测评,展示了苹果新的 M1 芯片在 Mac 上的突破性性能,但如果再加上电池续航指标,其改进就更加令人印象深刻了.TechCrunc ...

最新文章

  1. 二分法与简单遍历的效率比较
  2. 【解决问题】OpenCV(3.4.1) Error: Parsing error (xx.yaml(13): Incorrect indentation) in icvYMLParseValue
  3. git serialtool_Git学习笔记---协作的一般流程
  4. java中treemap_Java TreeMap – Java中的TreeMap
  5. (1)-(Two SUM-在数组中找到两个数,他们的和为给定的数)-(数组遍历)
  6. lammps教程:delete_atoms 命令详解
  7. AWSome Day 2019 线上云技术课堂(1)
  8. 旅行规划(travel)
  9. android studio 实例代码,android studio学习之一(示例代码)
  10. [RK3568 Android11] 开发之调试RK809 codec音频-MIC
  11. 北京上海楼市有价无市局面愈演愈烈
  12. WIN 10 初体验:期待越多失望越大
  13. 《Developing and maintaining clients’ trust through institutional mechanisms in online...》中英文对比文献翻译
  14. sql怎么给字段备注
  15. 企业会员邮件群发解决方案
  16. P110中 深拷贝与浅拷贝问题
  17. 计算机四级信息安全工程师 题纲
  18. 汽车软件刷新——当前安全访问策略的缺陷及改进方案
  19. Vue 点击按钮跳转其他链接
  20. 字符串(字节)长度计算

热门文章

  1. JFreeChart(八)之时序图
  2. Java IO: 其他字符流(下)
  3. jdk和cglib简单理解
  4. 装饰器模式和代理模式的区别
  5. publiccms实现多层级选项卡效果
  6. mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)
  7. SpringMVC支持ant风格的路径
  8. apache.camel_Apache Camel 3.1 – XML路由的快速加载
  9. sap wad_使用网真和WAD热部署Kubernetes
  10. jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强