Project Lombok——带给你简洁、清晰的代码
相信但凡有一点Java编程经历的人,都见过或者写过下面这种代码。这是一个简单的POJO,只有4个fields,加上构造器、equals
、hash
、toString
以及各种getter setter
,前前后后加起来大约70多行代码。这还只是4个fields,如果有十个以上,那么代码行数轻轻松松过一百。如果老板或主顾们按代码行数给钱的话,Java程序员应该都发财了。
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
public Mountain(String name, double latitude, double longitude, String country) {
//...巴拉巴拉
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Mountain mountain = (Mountain) o;
return Double.compare(mountain.latitude, latitude) == 0 &&
Double.compare(mountain.longitude, longitude) == 0 &&
Objects.equals(name, mountain.name) && Objects.equals(country, mountain.country);
}
//各种getter setter toString hashCode...etc
}
有了代码自动生成,这种苦痛会稍微降低点,但是你的代码仍然会显得“脏乱”。Project Lombok,一个成熟的library,通过编译期插入的方式,大量减少样板代码,让你的代码显得干净、简洁、易读。相信很多人都用上了,没用的,建议赶紧上车。
安装
在Maven的pom文件中加入
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
即可安装成功。你也可以到官网下载jar包,通过IDE直接导入,但是不推荐。窃以为,连前端都少不了npm的年代,Maven和Gradle至少二选一。
另外,譬如IntelliJ Idea
这种IDE,需要在plugin market
里搜索lombok
,下载并安装相关插件,否则IDE会报错。
使用注解简化代码
这里主要介绍一些常用注解。
剪除getter、setter样板代码
@Setter @Getter @EqualsAndHashCode @ToString(exclude = {"country"})
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
注解的名称几乎都是自解释的。
@Setter
、@Getter
可以生成全部非静态field的getter和setter方法,@EqualsAndHashCode
可以生成标准的equals()
和hashCode()
方法。@ToString
,顾名思义,生成toString()
方法,其中exclude
属性用于排除不想出现在返回值中的field。
从图中也可以看出,各种getter
、equals
等方法,已经在编译期生成了。
另外@Setter
、@Getter
也可以注解到filed上,对于某些field,我们只想提供getter
方法,直接注解field的方式更加灵活。
空值检查——@NonNull
@Setter @Getter @NonNull
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
通过@NonNull
注解,可以自动检查setter
方法的入参是否非空,当传入null
值时,则抛出空指针异常。它等同于以下实现,
public id setName(@NonNull final String name){
if(name == null) throw
new java.lang.NullPointerException("name");
this.name = name;
}
生成构造器
@NoArgsConstructor @AllArgsConstructor
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
使用@NoArgsConstructor
可以生成空参构造器,就像编译器平日为我们做的一样。@AllArgsConstructor
可以生成包含全部非静态field的构造器。
融合多个注解——@Data
以上一个一个注解的添加上去,仍然非常的繁琐,有没有一键搞定的注解?
@Data @AllArgsConstructor
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
@Data
,相当于@ToString
+ @EqualsAndHashCode
+@Getter
+@Setter
+@RequiredArgsConstructor
。配合@AllArgsConstructor
几乎能覆盖日常大部分需求。
另外,@Data
还有一个亲兄弟——@value
,功能几乎等同于@Data
+@AllArgsConstructor
,不同的是,它生成的是不可变类(Immutable class)。在class
关键字前会自动加上final
修饰符,且不再提供各个field
的setter
参数。
生成构造器——@Build
@Builder
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
@Build
注解可以提供给当前对象一个构造器。不知道有咩有童鞋有过这样的经历,为了提供不同field组合的初始化构造器,结果必须写一大堆构造器重载方法。如果有10+的filed的话,仅仅构造器就有100行代码。对于这种情况,《Effetive Java》的作者建议,我们应该提供一个构造器,而不是重载一堆让人眼花缭乱的构造器。现在,我们仅仅添加一个@Build
,就可以做到大神提供的最佳实践。
其调用起来也非常简单:
Mountain.builder()
.name("tai")
.country("china").latitude(22.456).build();
这样看起来是不是更加的舒服、简洁呢!
结语以及其他
另外还有@Cleanup
注解,它相当于try-with-resource的另一个版本,避免手动调用各种丑陋的close()
方法。在Java7之前这是很好用的,现在也可以作为你的备选项。
@Synchronized
,用于标注静态方法,相当于原生的syncronize
关键字。
@Log4j2
配合apache的log4j2库使用,注解在class级别上
@Log4j
public class TestModel {
public void hello(){
log.info("log....");
}
}
以上都是一些常用的注解,他们可以消除我们日常大部分的POJO样板代码,使代码保持简洁、易读,更多特性和注解可以参考官方文档。
Project Lombok——带给你简洁、清晰的代码的更多相关文章
- x-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码
ylbtech-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码 1.返回顶部 1. REDUCING BOILERPL ...
- mybatis generator插件系列--lombok插件 (减少百分之九十bean代码)
经常使用mybatis generator生成代码的你 有没有因为生成的getter/setter而烦恼呢? 有没有生成后又手动加toString/hashCode/Equals方法呢? 有没有改一个 ...
- 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired
大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...
- 简洁的java代码
最近在codewars上刷题,学习到了不少简洁优雅的代码. codewars和leetcode都是刷题网站,codewars的题目难度分类比较广,适合各种不同水平的coder刷题. 刷完题后,看一下其 ...
- 百度地图API显示多个标注点带百度样式信息检索窗口的代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 使用 Lombok 简化项目中无谓的Java代码
在写使用Java时,难免会有一些模板代码要写,不然get/set,toString, hashCode, close 资源,定义构造函数等等.代码会显得很冗余,很长.Lombok项目可以是我们摆脱这些 ...
- 【转】通过lombok带你读透Builder构建器
原地址:https://www.jianshu.com/p/0d8fc3df3647?from=timeline&isappinstalled=0 很久之前,我在<effective j ...
- HDU 1863:畅通project(带权值的并查集)
畅通project Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- CPU五级流水线project(带Hazard)
project简单介绍: 计算机组成原理课程Project--五级流水线hazard处理 思路说明: CPU架构图: CPU指令集: 代码在这里:cpu_hazard
随机推荐
- Spider_基础总结6--动态网页抓取--selenium
# 有些网站使用 '检查元素'也不能够好使,它们会对地址进行加密,此时使用Selenium 调用浏览器渲染引擎可以模拟用户的操作,完成抓取: # 注:selenium既可以抓取静态网页也可以抓取动态网 ...
- HTTP 抓包 ---复习一下
1.connection 字段 2.accept 字段 3.user-agent 字段 4.host字段 等字段需要注意: HTTP事务的延时主要有以下:1).解析时延 DNS解析与DNS缓存 客 ...
- 极客mysql02
mysql 一条更新语句的执行过程: 1.首先客户端通过tcp/ip发送一条sql语句到server层的SQL interface 2.SQL interface接到该请求后,先对该条语句进行解析,验 ...
- 06、MyBatis 逆向工程
1.MyBatis逆向简介 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java.mapper.x ...
- 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储
在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...
- mysql 不常用备忘
# group_concat 函数语法: group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符'] ...
- php在线预览pdf文件
话不多说,直接上代码 <?php public function read_pdf($file) { if(strtolower(substr(strrchr($file,'.'),1)) != ...
- springboot实战开发全套教程,让开发像搭积木一样简单!Github星标已上10W+!
前言 先说一下,这份教程在github上面星标已上10W,下面我会一一给大家举例出来全部内容,原链接后面我会发出来!首先我讲一下接下来我们会讲到的知识和技术,对比讲解了多种同类技术的使用手日区别,大家 ...
- 面试题59 - II. 队列的最大值
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的时间复杂度都是O(1). 若队列为空,pop_front 和 ...
- Java 滴IO系统
JAVA IO 流可以概括为 "两个对应,一个桥梁".两个对应指字节流(Byte Stream)和字符流(Char Stream)的对应,输入流和输出流的对应. 一个桥梁指从字节流 ...