当前位置: 首页 > news >正文

Lombok使用详解(转)

本文转自https://blog.csdn.net/u010695794/article/details/70441432

Lombok使用详解

前言

在Java中,封装是一个非常好的机制,最常见的封装莫过于get,set方法了,无论是Intellij idea 还是Eclipse,都提供了快速生成get,set方法的快捷键,使用起来很是方便,其实,我们还有更方便的办法,就是今天的主角-Lombok

Lombok是什么?

Lombok是一个通过注解以达到减少代码的Java库,如通过注解的方式减少get,set方法,构造方法等。

如何安装Lombok?

如何安装使用Lombok呢?

  • 方法一
    通过向lib文件夹中添加lombok.jar包即可,
  • 方法二 如果使用的是Maven,则可在项目的pom.xml文件中添加以下依赖:
  1.  
    <dependency>
  2.  
    <groupId>org.projectlombok</groupId>
  3.  
    <artifactId>lombok</artifactId>
  4.  
    <version>1.16.12</version>
  5.  
    </dependency>

通过以上两种方法的确可以使用Lombok的相关API了,但无论是Intelij idea,还是Eclipse默认情况下是不能识别的,我们还要让idea识别起来。
Intellij Idea方法:
File->settings->Plugins->Browse repositories->Lombok 如图所示:

1.3 如何使用Lombok?

Lombok提供注解方式来提高代码的简洁性,常用注解有:

  • @Data
  • @Setter @Getter
  • @NonNull
  • @Synchronized
  • @ToString
  • @EqualsAndHashCode
  • @Cleanup
  • @SneakyThrows

下面分别介绍每个方法的作用以及对应的源代码 @Data
该注解相当于同时加上以下注解@Setter @Getter,@ToString,@EqualsAndHashCode,作用于类中 使用:

  1.  
    /**
  2.  
    * author: andy
  3.  
    * date: 17-4-22
  4.  
    * blog: www.andyqian.com
  5.  
    */
  6.  
    @Data
  7.  
    public class Person {
  8.  
    private String name;
  9.  
    private String address;
  10.  
    private String city;
  11.  
    private String state;
  12.  
    private String zip;
  13.  
    private Date brithday;
  14.  
    }

效果如下:

@Getter@Setter
作用于属性上,自动生成get,set方法.

  1.  
    /**
  2.  
    * author: andy
  3.  
    * date: 17-4-22
  4.  
    * blog: www.andyqian.com
  5.  
    */
  6.  
    public class Person {
  7.  
    @Getter@Setter
  8.  
    private String name;
  9.  
    }

等价源码:

  1.  
    public String getName() {
  2.  
    return name;
  3.  
    }
  4.  
     
  5.  
    public void setName(String name) {
  6.  
    this.name = name;
  7.  
    }

@NonNull
该注解快速判断是否为空,如果为空,则抛出java.lang.NullPointerException
使用方法:

  1.  
    /**
  2.  
    * author: andy
  3.  
    * date: 17-4-22
  4.  
    * blog: www.andyqian.com
  5.  
    */
  6.  
    public class Person {
  7.  
     
  8.  
    private String name;
  9.  
     
  10.  
    @Setter@Getter@NonNull
  11.  
    private List<Person> member;
  12.  
    }

源码:

  1.  
    @NonNull
  2.  
    private List<Person> members;
  3.  
     
  4.  
    public Family(@NonNull final List<Person> members) {
  5.  
    if (members == null) throw new java.lang.NullPointerException("members");
  6.  
    this.members = members;
  7.  
    }
  8.  
     
  9.  
    @NonNull
  10.  
    public List<Person> getMembers() {
  11.  
    return members;
  12.  
    }
  13.  
     
  14.  
    public void setMembers(@NonNull final List<Person> members) {
  15.  
    if (members == null) throw new java.lang.NullPointerException("members");
  16.  
    this.members = members;
  17.  
    }

@Synchronized
该注解自动添加到同步机制,有趣的是,生成的代码并不是直接锁方法,而是锁代码块, 作用范围是方法上
使用方法:

  1.  
    private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
  2.  
     
  3.  
    @Synchronized
  4.  
    public String synchronizedFormat(Date date) {
  5.  
    return format.format(date);
  6.  
    }

生成等价源码:

  1.  
    private final java.lang.Object $lock = new java.lang.Object[0];
  2.  
    private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
  3.  
     
  4.  
    public String synchronizedFormat(Date date) {
  5.  
    synchronized ( $lock) {
  6.  
    return format.format( date);
  7.  
    }
  8.  
    }

@ToString
该方法大家应该非常熟悉,但需要注意的是:@ToString有多个属性可以进一步设置:

  • callSuper 是否输出父类的toString方法,默认为false
  • includeFieldNames 是否包含字段名称,默认为true
  • exclude 排除生成tostring的字段

使用方法:

  1.  
    /**
  2.  
    * author: andy
  3.  
    * date: 17-4-22
  4.  
    * blog: www.andyqian.com
  5.  
    */
  6.  
    @ToString(callSuper = true,exclude ={"name"})
  7.  
    public class Person {
  8.  
    private String name;
  9.  
    private String address;
  10.  
     
  11.  
    }

等价源码:

  1.  
    public String toString() {
  2.  
    return "Person{" +
  3.  
    "address='" + address + '\'' +
  4.  
    '}';
  5.  
    }

@Cleanup
注释可用于确保已分配的资源被释放,如IO的连接关闭。
使用方法:

  1.  
    public void testCleanUp() {
  2.  
    try {
  3.  
    @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
  4.  
    baos.write( new byte[] {'Y','e','s'});
  5.  
    System. out.println(baos.toString());
  6.  
    } catch (IOException e) {
  7.  
    e.printStackTrace();
  8.  
    }
  9.  
    }

等价源码:

  1.  
    public void testCleanUp() {
  2.  
    try {
  3.  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
  4.  
    try {
  5.  
    baos.write( new byte[]{'Y', 'e', 's'});
  6.  
    System. out.println(baos.toString());
  7.  
    } finally {
  8.  
    baos.close();
  9.  
    }
  10.  
    } catch (IOException e) {
  11.  
    e.printStackTrace();
  12.  
    }
  13.  
    }

1.4 参考资料

  • Github https://github.com/rzwitserloot/lombok
  • 官网 https://projectlombok.org/

1.5 小结

通过前面从安装,到使用的案例章节的讲解,希望Lbok能够给你带来更大的coding快感。

相关文章:

  • 【JS基础】--位置距离小结
  • Java中泛型ClassT、T与Class?
  • 查询优化器
  • malloc(0)的返回值
  • linux安装mysql5.7.19
  • Python(生成执行文件)
  • Dart4Flutter - 不可变性
  • Android Toolbar的使用 顶部标题栏+后退键
  • 物联网技术周报第 141 期: 使用 Alexa Voice 和 Raspberry Pi 构建图片识别应用
  • MySQL中sync_relay_log选项对I/O thread的影响分析
  • IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库...
  • 13、jmeter抓包之浏览器请求
  • HDU 5969 最大的位或【贪心/按位或/思维】
  • Linux内核中的锁——知识点
  • 浅谈Service Mesh体系中的Envoy
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CentOS 7 防火墙操作
  • CSS盒模型深入
  •  D - 粉碎叛乱F - 其他起义
  • Django 博客开发教程 8 - 博客文章详情页
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java-详解HashMap
  • tensorflow学习笔记3——MNIST应用篇
  • 给Prometheus造假数据的方法
  • FaaS 的简单实践
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • $(function(){})与(function($){....})(jQuery)的区别
  • (AngularJS)Angular 控制器之间通信初探
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (SpringBoot)第二章:Spring创建和使用
  • (二)linux使用docker容器运行mysql
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (四)c52学习之旅-流水LED灯
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)人的集合论——移山之道
  • .NET 读取 JSON格式的数据
  • .Net 高效开发之不可错过的实用工具
  • .NET下的多线程编程—1-线程机制概述
  • @DataRedisTest测试redis从未如此丝滑
  • @Transactional 详解
  • @Valid和@NotNull字段校验使用
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [HackMyVM]靶场 Wild
  • [HackMyVM]靶场Boxing
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
  • [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用...
  • [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表