如何编写更少,更好的代码,或Project Lombok
我长期以来一直打算撰写有关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相关推荐
- 精要主义:更少但要更好
精要主义:更少但要更好 不是提倡做更多的事,而是做对的事 时间只用于有意义的事: -克服根深蒂固的想法:我必须做,我都要完成,我能二者兼顾 -我选择做,我可以做任意而不是所有的事,只有小部分的事是重要 ...
- lombok 简化代码_如何编写更少,更好的代码,或Project Lombok
lombok 简化代码 我长期以来一直打算写有关Lombok的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它. 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能 ...
- Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回
在上一篇有关Lombok库的文章中 ,我描述了一个库,该库有助于处理Java中的样板代码( 是的,我知道这些问题已经在Kotlin中解决了 ,但这是现实生活,我们不能一味地坐下来,一旦出现较新或更简单 ...
- 单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试
单元测试junit参数 大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们. 而且,大多数人不喜欢在他们从事的项目中编写单元测试. TDD的人当然处于另一面,但根据我的经验,他们 ...
- 如何编写更高层次嵌入式C代码?
如何编写更高层次嵌入式C代码? 1. 简介 2. C语言特性 2.1处处都是陷阱 2.1.1 无心之过 2.1.2 数组下标 2.1.3 容易被忽略的break关键字 2.1.4 意想不到的八进制 2 ...
- SpringMVC集成Hibernate Validator进行注解式的参数校验——让代码更少、更加专注于业务逻辑
SpringMVC集成Hibernate Validator进行注解式的参数校验 --让代码更少.更加专注于业务逻辑 1 问题背景: 参数验证是一个常见的问题,例如验证用户输入的密码是否为空.邮箱是否 ...
- azure上传代码_深入了解Azure Data Studio:更多代码和更少GUI
azure上传代码 In the previous two articles, Starting your journey with Azure Data Studio and Developing ...
- 低代码的兴起:花更少的钱,赚更多的钱
"低代码"或"无代码"应用程序并不新鲜.事实上,它们已经存在了几十年,但直到最近几年才成为主流. 作者 | Clay Norris 编译 | 风车云马 责编 | ...
- 耗电更少,苹果 M1 编译代码速度与 2019 年 Mac Pro 一样快
近期苹果自研M1处理器讨论度非常高,我们已经看到了许多基准测试结果和测评,展示了苹果新的 M1 芯片在 Mac 上的突破性性能,但如果再加上电池续航指标,其改进就更加令人印象深刻了.TechCrunc ...
最新文章
- 二分法与简单遍历的效率比较
- 【解决问题】OpenCV(3.4.1) Error: Parsing error (xx.yaml(13): Incorrect indentation) in icvYMLParseValue
- git serialtool_Git学习笔记---协作的一般流程
- java中treemap_Java TreeMap – Java中的TreeMap
- (1)-(Two SUM-在数组中找到两个数,他们的和为给定的数)-(数组遍历)
- lammps教程:delete_atoms 命令详解
- AWSome Day 2019 线上云技术课堂(1)
- 旅行规划(travel)
- android studio 实例代码,android studio学习之一(示例代码)
- [RK3568 Android11] 开发之调试RK809 codec音频-MIC
- 北京上海楼市有价无市局面愈演愈烈
- WIN 10 初体验:期待越多失望越大
- 《Developing and maintaining clients’ trust through institutional mechanisms in online...》中英文对比文献翻译
- sql怎么给字段备注
- 企业会员邮件群发解决方案
- P110中 深拷贝与浅拷贝问题
- 计算机四级信息安全工程师 题纲
- 汽车软件刷新——当前安全访问策略的缺陷及改进方案
- Vue 点击按钮跳转其他链接
- 字符串(字节)长度计算
热门文章
- JFreeChart(八)之时序图
- Java IO: 其他字符流(下)
- jdk和cglib简单理解
- 装饰器模式和代理模式的区别
- publiccms实现多层级选项卡效果
- mybatis简单案例源码详细【注释全面】——Dao层接口(UserMapper.java)
- SpringMVC支持ant风格的路径
- apache.camel_Apache Camel 3.1 – XML路由的快速加载
- sap wad_使用网真和WAD热部署Kubernetes
- jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强