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

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 简化代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

discuz3.1用哪个版本php版本好,Discuz应用中心安装模板提示版本号不匹配适用于X3.3 X3.2 X3.1的解决方法...

有时候我们从应用中心安装模板,在应用中心里模板作者设定允许我们的程序版本,但是我们安装时却提示版本号不匹配,那这是为什么呢?经过我们分析发现是因为X3和X3.1,X3.2的模板是完全兼容的,很多模板是在X3的…

Linux 系统服务管理器(初始化系统/init system) -- systemd 及命令 systemctl 的详细介绍

文章目录一、系统服务管理器 systemd(一)systemd 的特性(二)systemd 与 传统 init 系统的区别(三)systemd 的目录和文件(四)systemd 的 Unit 介绍1.Unit 类型2.Unit 的配置文件&…

arch linux arm下载_arm开发板运行hello word的详细过程

arm开发板运行helloword1.uboot的编译​ 这里已经安装好了交叉编译工具链,如果自己的电脑下没有,请自行百度安装。将下载好uboot到linux下,进行解压-->打补丁-->编译-->烧写,执行以下命令完成上述四个步骤(不…

关于通信matlab 仿真,关于MATLAB在通信仿真系统中的运用

关于 MATLAB在通信仿真系统中的运用 卢 钊 贵 广 东南方 电信规 划 咨询 设 计院 有 限公 司 广 东 揭 阳 522031 【摘 要 】本文采用MATLAB软件 ,采集一些图像对其进行图像增 强处理以及MATLAB提供的可视化 SiinuIi nk建立 了扩频通信 系统仿真模 型 ,并…

化学专业尽早转行_尽早查看针对Java 11的功能

化学专业尽早转行随着JDK 10即将进入其候选发布阶段 ,通过JDK 11观察一下之后将会发生什么是很有趣的。 在撰写本文时,四个JEP ( JDK增强建议 )已正式成为JDK 11的目标(可能会出现)。 这篇文章总结了一些当…

系统服务管理与控制程序(Init System/初始化系统)-- Systemd 的 Unit 配置文件详解

文章目录一、Service 的配置文件(一)[Unit] 区块(二)[Service] 区块1.启动命令2.启动类型3.重启行为(三)[Install] 区块二、Target 的配置文件三、重载配置文件和重启服务一、Service 的配置文件 一个服务…

matlab乘法器数量级统一,基于matlab的数字滤波器的设计

1 数字滤波器的概述数字滤波器可以用差分方程、单位取样相应以及系统函数等表示,对于研究系统的实现方法,及它的运算结构来说,用狂徒便是最为直接。一个给定的输入输出关系,可以用多种不同的数字网络来实现。在不考虑量化影响是&a…

spring 计划任务_与Spring的计划任务一起按时运行

spring 计划任务您是否需要每天像闹钟一样在同一时间运行某个流程? 然后,Spring的预定任务适合您。 允许您使用Scheduled注释方法,以使其在指定的时间或内部间隔运行。 在本文中,我们将研究建立一个可以使用计划任务的项目&#x…

小程序 input自动换行_直播 | 最实用的微信小程序自动化测试技术独家揭秘

随着微信小程序的功能和生态日益完善,很多企业级小程序项目的页面越来越多,业务逻辑也越来越复杂。如何做好微信小程序的自动化测试成为测试同学面临的一大难题。如何合理构建多端架构和自动化测试体系?如何深入理解微信小程序特性和技术原理…

sit matlab,LabView SIT工具包的使用和安装说明

之前一直在用Simulink做仿真模型,现在要做测试需要用NI的设备和LabView软件,通过一段时间的学习,在SIT的使用上有了点小认识拿来跟大家分享一下。需要注意的是,必须是先安装MatLab Simulink 然后安装SIT工具包,如果先安…

php cdi_CDI中的事务异常处理

php cdi在Java EE中,在执行事务性业务方法期间引发的异常导致事务回滚。 但是,只有系统异常(即运行时异常)才是这种情况,该方法异常未在方法签名中声明。 对于应用程序异常(即检查的异常)或任何…

opencv 把3通道图像转成单通道_小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

引入问题引入,考虑以下几个问题:Q1. 一个3通道像素p的BGR分量(8bit表示)值均相同,那么这个像素是什么颜色的?Q2. 该像素p加上自己,即,像素p的各个通道值翻倍,那么这个像素…

Linux(CentOS 7.x) 下如何设置 nginx 开机启动?

CentOS 7 以上是用 Systemd 进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统,Systemd 服务文件以 .service 结尾。 使用命令 yum 安装 nginx 如果用 yum install 命令安装 nginx,yum 命令会自动在目录 /usr/lib/systemd/system …

mvc 404错误 php,java - springmvc 请求无法到达controller,出现404错误

springmvc 请求无法到达controller,出现404错误web.xmltestmvcindex.htmlindex.htmindex.jspdefault.htmldefault.htmdefault.jspspringmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc-servlet.xml1springmvc/org.…

jdk 1.8 不可变常量_在JDK 10中不可变与不可修改

jdk 1.8 不可变常量大约两个月前, 斯图尔特马克斯 ( Stuart Marks)写道:“ 不变性就像葡萄酒 。” 然后,他提醒读者注意叔本华的熵定律 :“如果将一勺酒倒入装满污水的桶中,就会产生污水。 如果…

diff算法_传统Diff算法为什么时间复杂度要O(n ^3)

原文链接:https://juejin.im/post/6892671384976097287很多文章提到的都是新旧DOM树需要两两对比,但是没有说清楚为什么。思考大家想一下,如果让你来设计将一棵树转换为另一棵树,你会怎么设计?可能是直接暴力的根据ind…

CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解

文章目录一、systemd 的由来(一)常用的 init 系统(二)init 程序的缺点(三)systemd 简介(四)systemd 架构图二、服务管理三、unit 配置文件(一)概述&#xff0…

python 指针指向的内容,python-文件的读取及指针位置

文件的读取及指针位置打开文件的三步:打开->操作->关闭文件的读取:f open(/tmp/passwd)打开f.close()操作完,关闭文件判断文件对象拥有的权限print(f.readable())是否拥有可读权限True or Falshprint(f.writable())是否拥有可写权限文…

jax-rs jax-ws_对状态代码使用JAX-RS异常

jax-rs jax-ws从JAX-RS资源发送特定HTTP(错误)状态代码的一种方法是使用javax.ws.rs.core.Response类及其类似Builder Pattern的API。 如果要根据响应主体指定返回类型,则仍然可以这样做,并通过抛出WebApplicationException针对错…

Linux 及其它类 Unix 系统的系统服务管理和控制程序(初始化系统/init system)简单梳理

文章目录一、Linux 的启动过程二、初始化程序(一)System V init(二)Upstart init(三)systemd(四)Launchd(五)Epoch(六)Mudar一、Linux…