相信但凡有一点Java编程经历的人,都见过或者写过下面这种代码。这是一个简单的POJO,只有4个fields,加上构造器、equalshashtoString以及各种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修饰符,且不再提供各个fieldsetter参数。

生成构造器——@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——带给你简洁、清晰的代码的更多相关文章

  1. x-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码

    ylbtech-杂项-maven-repository-lombok-intro:使用PROJECT LOMBOK减少BOILERPLATE代码 1.返回顶部 1. REDUCING BOILERPL ...

  2. mybatis generator插件系列--lombok插件 (减少百分之九十bean代码)

    经常使用mybatis generator生成代码的你 有没有因为生成的getter/setter而烦恼呢? 有没有生成后又手动加toString/hashCode/Equals方法呢? 有没有改一个 ...

  3. 利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

    大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService {@Autowiredprivate UserService userServic ...

  4. 简洁的java代码

    最近在codewars上刷题,学习到了不少简洁优雅的代码. codewars和leetcode都是刷题网站,codewars的题目难度分类比较广,适合各种不同水平的coder刷题. 刷完题后,看一下其 ...

  5. 百度地图API显示多个标注点带百度样式信息检索窗口的代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 使用 Lombok 简化项目中无谓的Java代码

    在写使用Java时,难免会有一些模板代码要写,不然get/set,toString, hashCode, close 资源,定义构造函数等等.代码会显得很冗余,很长.Lombok项目可以是我们摆脱这些 ...

  7. 【转】通过lombok带你读透Builder构建器

    原地址:https://www.jianshu.com/p/0d8fc3df3647?from=timeline&isappinstalled=0 很久之前,我在<effective j ...

  8. HDU 1863:畅通project(带权值的并查集)

    畅通project Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. CPU五级流水线project(带Hazard)

    project简单介绍: 计算机组成原理课程Project--五级流水线hazard处理 思路说明: CPU架构图: CPU指令集: 代码在这里:cpu_hazard

随机推荐

  1. martini-拓扑映射

    如何为一个新的分子创建拓扑文件? 这是martini应用的关键.http://jerkwin.github.io/2016/08/31/Martini%E5%B8%B8%E8%A7%81%E9%97% ...

  2. Blazor中的CSS隔离

    1.环境 VS 2019 16.9.0 Preview 1.0 .NET SDK 5.0.100 2.前言 CSS一旦生效,就会应用于全局,所以很容易出现冲突.为了解决这个问题CSS隔离就顺势而生.B ...

  3. redis部署安装【建议收藏】

    一.redis安装教程 1.安装redis ~]# yum -y install gcc gcc-c++ make ~]# tar -xf redis-4.0.8.tar.gz ~]# cd redi ...

  4. C语言中的const用法

    Const是什么? const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...

  5. 深度分析ReentrantLock源码及AQS源码,从入门到入坟,建议先收藏!

    一.ReentrantLock与AQS简介 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:Reentra ...

  6. 这个厉害了,ssm框架整合全过程,建议收藏起来好好看看

    1.0 环境要求 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 1.1 数据库 创建书籍数据库表,包括书籍编号,书籍名称,书籍数量以及书籍描述. CREATE DATABA ...

  7. 怎么用在线思维导图Ayoa规划个人任务

    在Ayoa的任务板功能中可以对某一任务进行详细设置,例如改变紧急情况/重要程度.添加到我的计划工具.设置开始日期.截止日期等. 图1:任务详情设置 而这里的"我的计划工具"就是一个 ...

  8. EasyRecovery——信息时代的“后悔药”

    前几日,小编在豆瓣潜水的时候看到这么一个帖子,说是一对小情侣吵架,女方一气之下把男方的博士论文和资料全删了,求一个办法让男友消气. 站在吃瓜的角度,小编和广大群众看法一致,希望两人直接分手,放男方一条 ...

  9. ABBYY FineReader 15 文档转换功能

    我们平常工作的时候总会固定地只用某几个文档格式,有的人经常使用office,所以电脑内就没安装PDF阅读器,这个时候就需要文档转换器了,ABBYY FineReader 15 也能够帮助我们实现快速的 ...

  10. ?.可选链操作符( ?. ) 可选链运算符可防止抛出 TypeError: Cannot read property ’xxx' of undefined。

    可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效.?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null ...