1. 什么是lombok

官网原话 :

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.

Lombk是一个java库 , 它可以自动注入到你的编辑器与构建工具中 , 从而对java进行增强 .

Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

通过一个注解 , 你的类就即可获得一个功能齐全的构建器 , 不用再重写getter 和equals 方法(自动生成) , 以及会自动为你生成一个用于记录日志的logger变量 与 其他更多功能 。

总的来说 , lombok就是一个java库 , 可以通过使用lombok提供的注解 , 从而可以省略一些重复代码的编写 , 例如getter , setter , equals 等方法的编写. 添加相关注解之后 , 会在编译阶段自动为我们生成 , 从而提高了代码可读性.

2. 使用准备

Maven项目中引入如下依赖 :

org.projectlombok

lombok

1.16.10

视情况还需要在IDE中安装lombok的插件 (这里以IDEA为例) :

1552065874909.png

安装完重启IDEA , 勾选如下配置 :

1552149258772.png

3. 常用注解解析

@NotNull

作用 : 避免空指针异常 , 当被标识的变量为null时 , 会自动抛出NullPointerException

作用位置 : 成员变量 , 方法形参

代码示例 :

使用@NotNull :

@Getter @Setter @NonNull

private List members;

等价的java源代码 :

@NonNull

private List members;

public Family(@NonNull final List members) {

if (members == null) throw new java.lang.NullPointerException("members");

this.members = members;

}

@NonNull

public List getMembers() {

return members;

}

//上面Members属性同时使用了@NotNull与@Setter,相当于在setter方法中在形参前添加@NotNull注解

//在形参前添加@NotNull相当于对形参进行空值判断

public void setMembers(@NonNull final List members) {

if (members == null) {

throw new java.lang.NullPointerException("members");

}

this.members = members;

}

@Cleanup

作用 : 自动帮我们调用资源对象的close()方法

作用位置 : 资源对象变量上

代码示例 :

使用@Cleanup注解 :

public void testCleanUp() {

try {

@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();

baos.write(new byte[] {'Y','e','s'});

System.out.println(baos.toString());

} catch (IOException e) {

e.printStackTrace();

}

}

等价的java源代码 :

public void testCleanUp() {

try {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

try {

baos.write(new byte[]{'Y', 'e', 's'});

System.out.println(baos.toString());

} finally {

baos.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

@Getter & @Setter

作用 :

@Getter : 生成对应的getter方法

@Setter : 生成对应的setter方法

作用位置 : 成员变量上

代码示例 :

使用@Getter与@Setter :

@Getter @Setter private boolean employed = true;

@Setter(AccessLevel.PROTECTED) private String name; // AccessLevel.PROTECTED指定生成的构造方法的权限修饰符为protected

等价的java源代码 :

private boolean employed = true;

private String name;

public boolean isEmployed() {

return employed;

}

public void setEmployed(final boolean employed) {

this.employed = employed;

}

protected void setName(final String name) {

this.name = name;

}

@EqualsAndHashCode

作用 : 根据成员变量生成equals()与hashCode()

作用位置 : 类上

常用属性 :

exclude : 指定要排除的属性 ;

of : 指定根据哪些属性生成equals()与hashCode() 方法;

callSuper : 该值为true时 , 生成的equals()与hashCode() 调用父类的equals()与hashCode() 方法 , 默认值为false ;

@NoArgsConstructor & @AllArgsConstructor & @RequiredArgsConstructor

作用 :

@NoArgsConstructor : 自动生成无参构造方法 ;

@AllArgsConstructor : 自动生成全参的构造方法 ;

@RequiredArgsConstructor : 对标识了@NotNull或者是final关键字的成员变量生成权限为private的构造方法 , 如何想要对外提供使用可以指定staticName属性生成一个static方法 ;

作用位置 : 均在类上

代码示例 :

使用lombok注解 :

import lombok.AccessLevel;

import lombok.RequiredArgsConstructor;

import lombok.AllArgsConstructor;

import lombok.NonNull;

@RequiredArgsConstructor(staticName = "of") //生成一个static方法,方法名为of

@AllArgsConstructor(access = AccessLevel.PROTECTED)

public class ConstructorExample {

private int x, y;

@NonNull private T description;

@NoArgsConstructor

public static class NoArgsExample {

@NonNull private String field;

}

}

等价的java源码 :

public class ConstructorExample {

private int x, y;

@NonNull private T description;

private ConstructorExample(T description) {

if (description == null) throw new NullPointerException("description");

this.description = description;

}

public static ConstructorExample of(T description) {

return new ConstructorExample(description);

}

@java.beans.ConstructorProperties({"x", "y", "description"})

protected ConstructorExample(int x, int y, T description) {

if (description == null) throw new NullPointerException("description");

this.x = x;

this.y = y;

this.description = description;

}

public static class NoArgsExample {

@NonNull private String field;

public NoArgsExample() {

}

}

}

@Data

作用 : 自动为所有字段添加@ToString, @EqualsAndHashCode, @Getter方法,为非final字段 添加@Setter, 以及在类上添加@RequiredArgsConstructor

作用位置 : 类上

代码示例 :

使用@Data注解 :

@Data(staticConstructor="of")

public class Company {

private final Person founder;

private String name;

private List employees;

}

等价的java源代码 :

public class Company {

private final Person founder;

private String name;

private List employees;

private Company(final Person founder) {

this.founder = founder;

}

//对应staticConstructor="of"

public static Company of(final Person founder) {

return new Company(founder);

}

public Person getFounder() {

return founder;

}

public String getName() {

return name;

}

public void setName(final String name) {

this.name = name;

}

public List getEmployees() {

return employees;

}

public void setEmployees(final List employees) {

this.employees = employees;

}

@java.lang.Override

public boolean equals(final java.lang.Object o) {

if (o == this) return true;

if (o == null) return false;

if (o.getClass() != this.getClass()) return false;

final Company other = (Company)o;

if (this.founder == null ? other.founder != null : !this.founder.equals(other.founder)) return false;

if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false;

if (this.employees == null ? other.employees != null : !this.employees.equals(other.employees)) return false;

return true;

}

@java.lang.Override

public int hashCode() {

final int PRIME = 31;

int result = 1;

result = result * PRIME + (this.founder == null ? 0 : this.founder.hashCode());

result = result * PRIME + (this.name == null ? 0 : this.name.hashCode());

result = result * PRIME + (this.employees == null ? 0 : this.employees.hashCode());

return result;

}

@java.lang.Override

public java.lang.String toString() {

return "Company(founder=" + founder + ", name=" + name + ", employees=" + employees + ")";

}

}

@Slf4j

作用 : 自动生成一个Logger的对象

作用位置 : 类上

代码示例 :

import lombok.extern.slf4j.Slf4j;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

@Slf4j

public class Slf4jTest {

//@Slf4j等价于如下代码

//private final Logger log = LoggerFactory.getLogger(Slf4jTest.class);

@Test

public void slfTest() {

log.debug("testing");

}

}

@Accessors

作用 : 通过该注解可以控制getter与setter 的命名与返回值 ;

作用位置 : 类上

属性 :

fluent : 默认值为false , 当fluent的值为true时 , @Data注解生成的 getter 与 setter 的方法名均为对应的成员变量名 , 且setter 的返回值为当前当前对象 , 如下所示;

@Data

@Accessors(fluent = true)

class User {

private Integer id;

private String name;

// 生成的getter和setter方法如下,方法体略

public Integer id(){}

public User id(Integer id){}

public String name(){}

public User name(String name){}

}

chain : 默认值为false , 当chain的值为true时 , @Data注解生成的setter的返回值为当前对象 , 相当于开启链式编程的开关 , 代码如下所示 ;

@Data

@Accessors(chain = true)

class User {

private Integer id;

private String name;

// 生成的setter方法如下,setter返回的是当前User对象 , 方法体略

public User setId(Integer id){}

public User setName(String name){}

}

prefix : 默认值为{} , 若指定prefix的值 , 则生成的getter与setter名为属性名 , 且会忽略其指定的前缀同时遵循驼峰命名原则 , 如下代码所示

@Data

@Accessors(prefix = "f")

class User {

private Integer fId; //属性名带f

private String fName;

// 生成的getter和setter方法如下,方法体略

public Integer id(){} // 生成的方法名为属性名去掉前缀

public void id(Integer id){}

public String name(){}

public void name(String name){}

}

lombok slfj 中_Lombok快速入门相关推荐

  1. lombok slfj 中_lombok @Slf4j注解

    背景 几个常用的 lombok 注解: @Data:注解在类上:提供类所有属性的 getting 和 setting 方法,此外还提供了equals.canEqual.hashCode.toStrin ...

  2. import lombok 报错_Lombok快速入门

    Lombok介绍: Lombok其实就是取名自龙目岛(Pulau Lombok),龙目岛是印度尼西亚西努沙登加拉(Nusa Tenggara Barat)省岛屿,西隔龙目海峡面对巴厘岛,东隔阿拉斯(A ...

  3. ACM中java快速入门

    2019独角兽企业重金招聘Python工程师标准>>> ACM中java快速入门 附: Chapter I. Java的优缺点各种书上都有,这里只说说用Java做ACM-ICPC的特 ...

  4. .NET中Hangfire快速入门和使用-迷恋自留地

    前言: 定时任务调度问题,是一个老生常谈的问题.网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quar ...

  5. vue3中ECharts快速入门

    前言 可视化就是把数据简单化 直接明了显示数据的比例,增长趋势等等 1.官方echarts数据可视化 2.vue3中使用echarts的配置 3.简单的柱状图 1.官方echart数据可视化 官方:A ...

  6. Enterprise Library 缓存应用程序块快速入门

    Enterprise Library 快速入门是简单的.易于理解的应用程序块关键特性的示例,使用了一个实现了常规场景的漫游集合来说明这些特性. 如果要理解一个应用程序块,快速入门将是理想的起始点,并且 ...

  7. SIMPLIS仿真软件2.1-SIMPLIS快速入门1

    SIMPLIS仿真软件2.1-SIMPLIS快速入门1 导读 新建原理图 设置快捷键 允许GUI界面更改元器件名称 搭建Buck电路 导读 本文是SIMPLIS仿真软件介绍的第二篇文章,是对SIMPL ...

  8. java8生成jsp页面内容组装到jsp中_JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署...

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

  9. matlab撤销上一步命令_CAD快速入门技巧:CAD软件中撤销操作的方法汇总

    在使用浩辰CAD软件画图的过程中都难免会误操作,因此CAD与WORD.EXCEL等其他软件一样,在误操作后可以通过"放弃"来取消刚进行的操作,Windows软件的常规操作也适用于C ...

  10. Java快速入门学习笔记9 | Java语言中的方法

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

最新文章

  1. Exchange对AD的访问
  2. Oracle Goldengate OGG 11g与各操作系统及数据库版本的兼容列表
  3. 为 raspberrypi 开发内核模块
  4. 批量生成6位数字_分享一款可做各种流水号的条码生成软件
  5. KR C 传统C语言的函数定义
  6. 6最好的之一 HTML5/CSS3 演示(PPT)框架
  7. linux好用的编译器,推荐几款Linux下比Notepad++好的编辑器软件
  8. HTML5类选择器使用,CSS选择器种类及使用方法
  9. Java中的引用数据类型-BigDecimal
  10. python3爬取中国药学科学数据
  11. C语言为什么要尽量少用全局变量
  12. android音频框架书籍,Android高级架构师系统学习——Android 音频可视化
  13. mysql 主从故障恢复
  14. 什么是线性同余法c语言,C语言线性同余法产生随机数
  15. ssci源刊里有开源期刊吗_SSCI和SCI期刊投稿指南-以经济学和管理学为例
  16. 反馈电路反馈类型的快速判断
  17. 取消桌面上计算机控制板网络三个系统图标,大神处置win10系统桌面图标“计算机 控制面板 网络”怎么不见了的解决方的步骤...
  18. 从来不敷面膜的人_女人一旦过了40岁,敷面膜要记住“3不要”,否则还不如不敷!...
  19. Windows10系统内置的emoji表情
  20. 2014 年最热门的国人开发开源软件 TOP 100 - 开源中国社区

热门文章

  1. 李宏毅2020机器学习笔记2——CXK
  2. Linux-开启Apache的虚拟主机功能(基于IP地址、基于主机域名、基于IP:端口号)
  3. Nanopore sequencing and assembly of a human genome with ultra-long reads
  4. Oracle (07)游标对象.智能循环(FOR) 遍历游标.NULL值的比较.异常处理.存储过程.如何指定参数的模式.function 函数.包 package.触发器 trigger
  5. 10年软件测试行业经验教你如何写简历【绝对靠谱】
  6. Multisim电路分析仿真-叠加原理
  7. 视频快搜新片热剧,百度手机浏览器上都有啊
  8. 日记侠:如何提高朋友圈活跃度,给你5种实用方法
  9. Python 绘制正多边形
  10. 计算机平面设计要学语数英吗,《计算机平面设计与制作》课程标准规范.doc