背景

最近在做一个小功能,又不想在原有体态臃肿的项目中追加,为了调试方便并且可以快速开发就采用了springboot。由于使用了JPA,建了几个类,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,那么Java中有没有一种方式能够避免这种重复的劳动呢?答案是有,想着前几天听说有一款简化神奇Lombok,特此拿来玩玩记录一下。

简介

Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。

官方地址:https://projectlombok.org/

github地址:https://github.com/rzwitserloot/lombok

Lombok注解

下面对Lombok的简单使用方法做一下总结:

  • @NotNull 作用在方法参数上的注解,用于自动生成空值参数检查。
  • @Cleanup 作用在局部变量上,在作用域结束时会自动调用close方法释放资源。
  • @Getter 作用在字段上,会自动生成字段的Getter;作用在类上,会自动生成该类所有非静态字段的Getter,还能控制Getter的访问级别
  • @Setter 基本同上。
  • @ToString 类注解,自动生成类的toString方法,可以做一些定制,比如不使用某个字段,不调用Getters等。
  • @EqualsAndHashCode 类注解,自动生成类中所有非静态非瞬时字段的equals方法和hashCode方法。
  • @NoArgsConstructor 类注解,自动生成一个无参构造函数。
  • @AllArgsConstructor 类注解,生成一个初始化所有字段的构造函数。
  • @RequiredArgsConstructor 类注解,为final字段和标记了@NotNull的字段生成构造函数。
  • @Data 类注解,相当于同时应用了@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。如果已经定义了一个构造方法,就不会再自动生成构造方法了。
  • @Value 类注解,和@Data类似,但是用于不可变类型。生成的类和所有字段都设置为final,所有字段都为private,自动生成Getter但是没有Setter,会生成初始化所有字段的构造函数。相当于同时应用了final @ToString、 @EqualsAndHashCode、 @AllArgsConstructor 、@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)和 @Getter。

实际开发中一般常用到的:

@Data

@NoArgsConstructor

@AllArgsConstructor

这三个,其他的没特殊需求可以自行忽略。

maven引用

由于开发中我们使用了Maven,直接在pom.xml中引入以下坐标:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.14</version>
</dependency>

下面是简单Bean示例:

@Data         // 生成 getter/setter/equals/canEqual/hashCode/toString
@NoArgsConstructor // 为类提供一个无参的构造方法
@AllArgsConstructor // 为类提供一个全参的构造方法
public class User {
private Integer id;
private String name;
private Integer age;
}

为了对比效果,下面是我们平时生成的Bean:

public class User {
private Integer id;
private String name;
private Integer age; public User() {
super();
} public User(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

可以看到,由于应用了@Data注解和两个构造方法注解,代码变得非常短小易读。当然Lombok也是存在诸多问题的,比如无法支持多种参数构造器的重载,需要安装IDE插件实现get,set效果。

Lombok原理

虽然Lombok也用到了注解,但是它并没有用到反射,而是通过一些奇技淫巧,在代码编译时期动态将注解替换为具体的代码。所以JVM实际运行的代码,和我们手动编写的包含了各种工具方法的类相同。

插件安装

其实,一开始博主以为不需要任何插件支持的,即使项目中引入了坐标,当你get属性的时候也会报错。

官网中其实提供了相关的配置,由于使用的是Eclipse,这里简单的说下Eclipse种的安装步骤。

1.下载lombok.jar包https://projectlombok.org/download.html

2.双击运行(有些系统安装的压缩包的问题可能无法执行)

3.重启Eclipse,然后update一下Maven项目即可。

JAVA奇技淫巧简化代码之lombok的更多相关文章

  1. Java 14 祭出代码简化大器,Lombok 要被干掉了?

    Java 14 3 月发布距现在已经发布 2 个多月,发布了很多新特性,详细的新特性介绍可以看这篇文章: http://www.javastack.cn/article/2020/java14-has ...

  2. 使用建造者模式和Lombok简化代码

    在项目开发中,我们经常需要构建对象.常见的做法有getter/setter,或者构造器构建对象. 可能会有人写出类似如下的代码: Company company=new Company(); comp ...

  3. 关于lombok插件的使用,强大的简化代码工具

    关于下载和安装lombok插件,过程特别简单,可以参考: https://blog.csdn.net/longloveqing/article/details/81539749 安装好后,下面介绍下l ...

  4. Java使用lamda表达式简化代码

    代码,自然写的越简洁越好啦,写的人舒服,看的人也舒服,一切为了高效. 要把有限的时间花到其它有意思的事情上去. 目的 学习简化代码的思路,使用jdk8新特性lamada表达式. 使用 某接口,只有一个 ...

  5. 简化开发:Lombok的使用

    Java中优雅的使用Lombok 1.简介 Lombok 是一种 Java实用工具,可用来帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO), 它通过注释实现这一目的.一个标准的 ...

  6. 【转】Java奇技淫巧-插件化注解处理API(Pluggable Annotation Processing API)

    参考资料 JDK6的新特性之六:插入式注解处理API(Pluggable Annotation Processing API) Java Annotation Processing and Creat ...

  7. Java进阶教程:使用Lombok提升开发效率

    Java进阶教程:使用Lombok提升开发效率 Lombok Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这 ...

  8. JAVA基础之代码简洁之道

    引言 普通的工程师堆砌代码,优秀的工程师优雅代码,卓越的工程师简化代码.如何写出优雅整洁易懂的代码是一门学问,也是软件工程实践里重要的一环.--来自网络 背景 软件质量,不但依赖于架构及项目管理,更与 ...

  9. Java中的代码点和代码单元(转)

    文章来源:http://blog.csdn.net/weizhaozhe/article/details/3909079 这篇文章讲的很细,但是对于初学者也很难理解,在后面的笔记中,我会陈述自己的简单 ...

随机推荐

  1. poj_3468: A Simple Problem with Integers (树状数组区间更新)

    题目是对一个数组,支持两种操作 操作C:对下标从a到b的每个元素,值增加c: 操作Q:对求下标从a到b的元素值之和. 这道题也可以用线段树解,本文不做描述,下面分析如何用树状数组来解决这道题. 先把问 ...

  2. express 最佳实践(二):中间件

    express 最佳实践(二):中间件 第一篇 express 最佳实践(一):项目结构 express 中最重要的就是中间件了,可以说中间件组成了express,中间件就是 express 的核心. ...

  3. (转载)Windows 上搭建Apache FtpServer

    因工作需要,最近经常接触到FTP,今天我来介绍一个开源的FTP服务器,那就是Apache FTPServer,Apache FTPServer是一个100%纯Java的FTP服务器. 它的设计是基于现 ...

  4. bootstrap-table 怎么自定义搜索按钮实现点击按钮进行查询

    bootstrap-table自带搜索框感觉有点丑,我们可以把搜索功能单独拉出来放到页面的某一个位置. 首先我们看一下官方演示: 如果你感觉集成的检索框不太好看,而且我们也不想让搜索框和列表放到一块去 ...

  5. 我的"Hello World!"之旅

    不知从何谈起,回想起三年前的自己,那会是高三:同时也是一个让无数骚年悸动的年代,那时候的我也在一个叫做“召唤师峡谷”神奇的地方闯荡了两年.那么,记忆又会回到2012年的元旦,伴随着几个好友,偷偷摸摸地 ...

  6. CentOS 下mysql ERROR&n…

    CentOS 下mysql ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO) 描述:在操作数据库时会出 ...

  7. list集合为空或为null的区别

    简述 判断一个list集合是否为空,我们的惯性思维是判断list是否等于null即可,但是在Java中,list集合为空还是为null,这是两码事. 新建一个list对象,默认值是空,而非null: ...

  8. CI 结合 vue.js 的搜索功能模块

    CI 结合 vue.js 的搜索功能模块 最近在有优化公司后台的某个模块的搜索功能优化 原先的是这个样子的,很是单调: 老大给我找个图希望我能弄成这样子: 经过不断修改,最后成了这样子 是不是比以前好 ...

  9. InputStreamReader读取文件出现乱码

    当你读取一个文本文件时,如果是在电脑记事本上面写的,然后保存.使用InputStreamReader读取出来,并且是按照他的编码格式读取出来,发现还是存在乱码,比如文本内容是“你好”,读出来显示是“? ...

  10. 微信小程序开发之微信支付

    微信支付是小程序开发中很重要的一个环节,下面会结合实战进行分析总结 环境准备 https服务器 微信小程序只支持https请求,因此需要配置https的单向认证服务(请参考 另一篇文章https受信证 ...