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注释在类字段中添加了标准的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

lombok 简化代码

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

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

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

  2. y空间兑换代码_如何用不到 2KB 的 JavaScript 代码写一个 3D 赛车游戏?

    几个月前,JS1k游戏制作节(JS1K game jam)传出不再举办消息后,许多游戏迷开始哀嚎. Frank Force 也是其中一位,但他还有另一层身份--一位德克萨斯州奥斯汀的独立游戏设计师.F ...

  3. android骰子游戏代码_真神器!不用手写一行代码就能做网站~

    点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货! 制作网站用什么,Dreamweaver 还是 Fireworks? 现在, ...

  4. 对文本根据特殊字符进行分段代码_如何优雅地配置快应用的代码片段

    本文使用 Zhihu On VSCode 创作并发布 作为一名程序员,在编码的过程中,难免会遇到要写些重复性的代码:假如每次都重新码一遍,既浪费了时间,也有伤身体.倘若可以配置一个像快捷键一样,输入简 ...

  5. vscode中怎样格式化js代码_[VSCode插件推荐] Bracket Pair Colorizer: 为代码中的括号添上一抹亮色...

    在代码编写过程中,各种括号 {[()]} 必不可少.然而,随着代码量的增加,你有没有因为括号的嵌套太多,而导致代码难以阅读? 我们来看看下面的代码,在第三行代码的最后部分,连续出现了5个右括号! 这还 ...

  6. 插件代码_我们开源了一款 SonarQube iOS 代码扫描插件

    背景: 我们在公司(好未来)内部开发了一套基于 SonarQube 的静态代码扫描服务,得益于 SonarQube 开源版本本身的功能,我们可以直接复用支持主流的编程语言,但 SonarQube 的开 ...

  7. python大作业代码_大二期末python大作业有效代码不低于5000行是什么水平?

    6月30日更新 鉴于题主说老师已经收回对行数的要求,就请大家看过则罢,不要再点赞了(还有收藏的是什么鬼?).本文说的不过是一些投机取巧的伎俩,不值取,不可取. ~~~以下是原文~~~: 一个熟练工程序 ...

  8. 老司机写的java代码_菜鸟 or 老司机?写段代码看看吧

    有的小伙伴可能用Python写代码已经非常久了,可能觉得已经是个高手了,那么看看下面这个简单的实现需求,你会写怎样的Python代码呢?通过你写的代码,应该可以大约评估下你到底是菜鸟还是一个老司机了, ...

  9. 记事本贪吃蛇游戏代码_厉害了,程序员28行代码写贪吃蛇游戏,附源码!

    对于贪吃蛇游戏,大家基本上都玩过,但是作为一个程序员,大家是否想过要自己去写一个贪吃蛇,毕竟玩别人写的游戏和自己写的游戏是两种截然不同的感受,而且也可以通过制作来提升自己的技术! 其实贪吃蛇的逻辑并不 ...

最新文章

  1. crud springmvc
  2. __user_initial_stackheap 库函数翻译(转)
  3. 应用虚拟化的五大理由
  4. datatable 多字段 排序;
  5. 阿里云智能视频 AI 重装来袭
  6. airpods固件更新方法_苹果发布 AirPods 新固件更新!
  7. 以太坊2.0合约余额新增8768 ETH
  8. EntityFramework 7 Linq Contains In 奇怪问题(已修复)
  9. 带本信息论看《三体》——信息论课程论文
  10. Quartus II 安装
  11. 学习js的第五天【作用域,递归,对象,数组】
  12. iphone4安装使用微信
  13. python qrcode 中文乱码_Python qrcode不一致
  14. 色散介质中的脉冲展宽
  15. 光电武器装备故障智能测试系统ETest研究
  16. echarts.js 下载
  17. 四象限法推导lm曲线_SEM如何用四象限法进行数据分析,提升CTR和CVR?
  18. 阿里云+宝塔+狂雨小说CMS:搭建小说网站
  19. python基础和第三方库 笔记(python基础完结包括高级用法,第三方库持续更新中...)
  20. grafana dashboard的导入导出

热门文章

  1. P3239 [HNOI2015]亚瑟王(期望)
  2. P3242 [HNOI2015] 接水果(整体二分、扫描线、dfs序)
  3. CF1242C-Sum Balance【状压dp】
  4. P1344-[USACO4.4]追查坏牛奶Pollutant Control【网络流,最小割】
  5. 2014 ACM/ICPC Asia Regional Xi'an Online
  6. 31、JAVA_WEB开发基础之servlet(2)
  7. SpringCloud Greenwich(五)之nacos、dubbo、Zuul和 gateway集成
  8. 腾讯面试题:一条SQL语句执行得很慢的原因有哪些?
  9. 数据库 - 事务管理(ACID)隔离级别 事务传播行为
  10. JAVA面试常考系列十