前言

Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务过程中冗余的代码,尤其是简单的Java模型对象(POJO)。而当我们如果在开发环境中使用Lombok开发插件后,可以省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生产这些方法,并没有如反射那样降低程序的性能。本文将带大家详细介绍关于Lombok的使用以及原理。

公众号:「浅羽的IT小屋」

1. Lombok的概念

「概念:」

  • Lombok是一种Java实用工具,可以用来帮助开发人员消除冗余的代码,对于一些简单的Java对象(POJO),它通过注释实现这一目的。

2、Lombok的安装

「安装步骤:」

  • 在IDEA的插件Plugins中搜索Lombok

  • 安装Lombok

「注意:」

  • 在使用Lombok注解的时候记得要导入Lombok.jar包到工程,Maven Project的话,要在pom.xml中添加依赖

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

3、Lombok注解说明

「常用注解:」

Lombok注解说明
* val:用在局部变量前面,相当于将变量声明为final
* @NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException)
* @Cleanup:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成try-finally这样的代码来关闭流
* @Getter/@Setter:用在属性上,再也不用自己手写setter和getter方法了,还可以指定访问范围
* @ToString:用在类上,可以自动覆写toString方法,当然还可以加其他参数,例如@ToString(exclude=”id”)排除id属性,或者@ToString(callSuper=true, includeFieldNames=true)调用父类的toString方法,包含所有属性
* @EqualsAndHashCode:用在类上,自动生成equals方法和hashCode方法
* @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有@NonNull属性作为参数的构造函数,如果指定staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多
* @Data:注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用
* @Value:用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法
* @Builder:用在类、构造器、方法上,为你提供复杂的builder APIs,让你可以像如下方式一样调用Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();更多说明参考Builder
* @SneakyThrows:自动抛受检异常,而无需显式在方法上使用throws语句
* @Synchronized:用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性$lock或$LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误
* @Getter(lazy=true):可以替代经典的Double Check Lock样板代码
* @Log:根据不同的注解生成不同类型的log对象,但是实例名称都是log,有六种可选实现类* @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);* @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());* @Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);* @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);* @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);* @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

4、Lombok代码示范

「代码示例:」

  • val将变量声明final类型

public static void main(String[] args) {val sets = new HashSet<String>();val lists = new ArrayList<String>();val maps = new HashMap<String, String>();//=>相当于如下final Set<String> sets2 = new HashSet<>();final List<String> lists2 = new ArrayList<>();final Map<String, String> maps2 = new HashMap<>();
}
  • @Nonnull为方法和构造函数的参数提供非空检查

public void notNullExample(@NonNull String string) {string.length();
}
//=>相当于
public void notNullExample(String string) {if (string != null) {string.length();} else {throw new NullPointerException("null");}
}
  • @Cleanup自动释放资源

public static void main(String[] args) {try {@Cleanup InputStream inputStream = new FileInputStream(args[0]);} catch (FileNotFoundException e) {e.printStackTrace();}//=>相当于InputStream inputStream = null;try {inputStream = new FileInputStream(args[0]);} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}
}
  • @Getter/@Setter对类的属性字段自动生成Get/Set方法

@Setter(AccessLevel.PUBLIC)
@Getter(AccessLevel.PROTECTED)
private int id;
private String shap;
  • @ToString为类生成一个toString方法

@ToString(exclude = "id", callSuper = true, includeFieldNames = true)
public class LombokDemo {private int id;private String name;private int age;public static void main(String[] args) {//输出LombokDemo(super=LombokDemo@48524010, name=null, age=0)System.out.println(new LombokDemo());}
}
  • @EqualsAndHashCode为类生成equals和hasCode方法

@EqualsAndHashCode(exclude = {"id", "shape"}, callSuper = false)
public class LombokDemo {private int id;private String shap;
}
  • @NoArgsConstructor,@RequiredArgsConstructor and @AllArgsConstructor,分别为类自动生成无参构造,指定参数构造器和包含所有参数构造器

@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class LombokDemo {@NonNullprivate int id;@NonNullprivate String shap;private int age;public static void main(String[] args) {new LombokDemo(1, "circle");//使用静态工厂方法LombokDemo.of(2, "circle");//无参构造new LombokDemo();//包含所有参数new LombokDemo(1, "circle", 2);}
}
  • @Data在类上使用,相当于同时使用@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor这些注解

import lombok.Data;
@Data
public class Menu {private String shopId;private String skuMenuId;private String skuName;private String normalizeSkuName;private String dishMenuId;private String dishName;private String dishNum;//默认阈值private float thresHold = 0;//新阈值private float newThresHold = 0;//总得分private float totalScore = 0;
}
  • @Value为属性添加final声明

@Value
public class LombokDemo {@NonNullprivate int id;@NonNullprivate String shap;private int age;//相当于private final int id;public int getId() {return this.id;}...
}
  • @Builder提供构建值对象方式

@Builder
public class BuilderExample {private String name;private int age;@Singularprivate Set<String> occupations;public static void main(String[] args) {BuilderExample test = BuilderExample.builder().age(11).name("test").build();}
}
  • @SneakyThrows自动抛受检异常

import lombok.SneakyThrows;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
public class Test {@SneakyThrows()public void read() {InputStream inputStream = new FileInputStream("");}@SneakyThrowspublic void write() {throw new UnsupportedEncodingException();}//相当于public void read() throws FileNotFoundException {InputStream inputStream = new FileInputStream("");}public void write() throws UnsupportedEncodingException {throw new UnsupportedEncodingException();}
}
  • @Synchronized将方法声明同步并自动加锁

public class SynchronizedDemo {@Synchronizedpublic static void hello() {System.out.println("world");}//相当于private static final Object $LOCK = new Object[0];public static void hello() {synchronized ($LOCK) {System.out.println("world");}}
}
  • @Getter(lazy=true)可以替代经典的Double check Lock样板代码

public class GetterLazyExample {@Getter(lazy = true)private final double[] cached = expensive();private double[] expensive() {double[] result = new double[1000000];for (int i = 0; i < result.length; i++) {result[i] = Math.asin(i);}return result;}
}// 相当于如下所示: import java.util.concurrent.atomic.AtomicReference;
public class GetterLazyExample {private final AtomicReference<java.lang.Object> cached = new AtomicReference<>();public double[] getCached() {java.lang.Object value = this.cached.get();if (value == null) {synchronized (this.cached) {value = this.cached.get();if (value == null) {final double[] actualValue = expensive();value = actualValue == null ? this.cached : actualValue;this.cached.set(value);}}}return (double[]) (value == this.cached ? null : value);}private double[] expensive() {double[] result = new double[1000000];for (int i = 0; i < result.length; i++) {result[i] = Math.asin(i);}return result;}
}
  • @Log根据不同的注解生成不同类型的log对象

    * @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);* @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());* @Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);* @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);* @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);* @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

结语

本篇关于Lombok的介绍就先到这里结束了,后续会出更多关于Lombok系列更多文章,谢谢大家支持!

如果你觉得浅羽的文章对你有帮助的话,请在微信搜索并关注「 浅羽的IT小屋 」微信公众号,我会在这里分享一下计算机信息知识、理论技术、工具资源、软件介绍、后端开发、面试、工作感想以及一些生活随想等一系列文章。所见所领,皆是生活。慢慢来,努力一点,你我共同成长...

我建立了一个技术群,如果你想了解到更多关于IT行业的技术以及生活中遇到的问题,欢迎小伙伴进群交流,只需添加我的微信,备注进群即可,期待你们的加入。

往期推荐

Redis使用|缓存穿透,雪崩,击穿以及解决方案分析

异步编程|五分钟让你学会局部刷新Ajax技术

全面解析|搞懂Nginx这一篇就够了

干货|SpringBoot JMS(ActiveMQ)API实践应用详解

彻底了解|利用Apache CXF框架开发WebService

极速上手使用Docker,这篇文章就够了!

关于项目中使用Druid数据库监控的配置

IntelliJ IDEA热部署工具JRebel的使用教程

浅羽

留言区

点个赞,证明你还爱我

简化开发|Lombok神器带你消除冗余代码相关推荐

  1. java冗余_Java使用lombok消除冗余代码的方法步骤

    一.项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法. lombok项目的产生就是为了 ...

  2. 芋道 Spring Boot 消除冗余代码 Lombok 入门

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...

  3. java开发之消除冗余代码的3种方法

    一.利用工厂模式+模板方法模式 我们以做蛋糕为例来演示如何消除重复代码. 假设我们要做3种不同口味的蛋糕,分别是抹茶,可可和草莓蛋糕,实际上3种蛋糕的制作方法是极其相似的,只有添加的粉剂不 同,如果用 ...

  4. 淫思奇巧篇 之 Lombok神器带你飞(简化POJO)

    LZ-Says:孤身在外,家里有点啥事儿也只能干着急,幸亏有兄弟,兄弟不言谢,记心底. 前言 遇到残暴的大佬,心里不由得为代码暗暗揪了心,不过撸码残暴起来,也是感觉到了一丝丝的爽~ 今天为大家介绍一个 ...

  5. Lombok神器带你飞(简化POJO)

    前言 遇到残暴的大佬,心里不由得为代码暗暗揪了心,不过撸码残暴起来,也是感觉到了一丝丝的爽~ 今天为大家介绍一个神器:Lombok. 希望各种各样的神器带来便捷的同时也为我们带来更多的Money~ 本 ...

  6. 使用Simian检查Java项目中冗余代码 1

       Simian UI 是一个用来发现重复代码的eclipse插件,对于改善设计,消除冗余代码很有帮助. 使用eclipse的Help->Software Update进行安装.站点地址为:h ...

  7. 使用Lombok简化开发及无效解决方案

    使用Lombok简化开发 介绍 △Lombok是什么 Lombok是一款小巧的代码生成工具.官方网址:http://projectlombok.org/ LomBok主要特性有:自动生成默认的gett ...

  8. 云开发喝酒神器2.0微信小程序源码/带流量主和重启人生小程序源码

    ☑️ 编号:ym387 ☑️ 品牌:无 ☑️ 语言:微信小程序 ☑️ 大小:1.97MB ☑️ 类型:云开发喝酒神器2.0 ☑️ 支持:小程序

  9. 2万字总结《MybatisPlus—为简化开发而生》

    <MybatisPlus-为简化开发而生> 文章目录 <MybatisPlus-为简化开发而生> 1.简介 2.特性 3.快速入门 1.创建数据库`mybatis-plus` ...

最新文章

  1. zongzi tutorial
  2. c语言和其他高级语言一样也要经过编译,C语言和其他高级语言的最大的区别是什么?...
  3. 读操作系统的设计与实现--进程互斥
  4. 地表最强mysql命令行连接工具mycli
  5. Android嵌入式安卓触摸屏|4418开发板平台
  6. html仿真花卉代码,仿真鲜花幼儿园手工教案
  7. 指定版本_小米五一购机福利,购买Redmi7指定版本,送小米活塞耳机
  8. python发布代码图片_gitpython模块与代码发布项目流程图
  9. Kepware AB驱动 · 秒懂百科
  10. 使用dig命令解析域名
  11. 屏幕准星工具软件_非常简单好用
  12. 关于win10无法正常关机
  13. 虚幻四C++入坑指南09:C++实现FPS游戏(3)Pitch Yaw Roll的作用 视角旋转 跳跃
  14. ts定义数组类型_ts中类型
  15. 从项目管理角度如何保证质量
  16. SpringBoot JPA 懒加载的问题 ---No session
  17. 转载:汇总详解:矩阵的迹以及迹对矩阵求导
  18. scrapy抓取的中文结果乱码解决办法
  19. 职场 | 联发科MTK手机通信协议软件开发工程师面试总结
  20. 财务报表包含哪些表?是季报还是月报?

热门文章

  1. Unity2D游戏使游戏角色移动的脚本
  2. 基于JAVA旅游路线规划系统计算机毕业设计源码+数据库+lw文档+系统+部署
  3. 计算机网络笔记整理(二)
  4. Elasticsearch中的date与时区问题
  5. 基于改进PSGAN的AI自动美颜化妆系统(源码&教程)
  6. 华北电力计算机专业排名,华电考研计算机专业排名
  7. 股票k线黄昏之星怎么看?黄昏之星k线图分析
  8. 【节能学院】关于芜湖某酒店电力运维系统的研究浅析
  9. 在OpenCV里车牌识别的方法2
  10. 动态功能连接组:最新技术和前景