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

【Lombok使用详解】

目录

      • 前言:注解速查
      • 1.Lombok概念
      • 2.安装Lombok
      • 3. 使用Lombok
        • 3.1 😊@Data
        • 3.2 @Getter@Setter
        • 3.3 @NonNull
        • 3.4 @Synchronized
        • 3.5 @ToString:自动生成toString()方法
        • 3.6 @Cleanup
        • 3.7 @EqualsAndHashCode

前言:注解速查

  • @NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常

  • @CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

  • @Setter/@Getter : 自动生成set和get方法

  • @ToString : 自动生成toString方法

  • @EqualsAndHashcode : 从对象的字段中生成hashCode() 方法和equals()方法的实现

  • @NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
    自动生成构造方法

  • @Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法

  • @Value : 用于注解final类

  • @Builder : 产生复杂的构建器api类

  • @SneakyThrows : 异常处理(谨慎使用)

  • @Synchronized : 同步方法安全的转化

  • @Getter(lazy=true) :

  • @Log: 支持各种logger对象,使用时用对应的注解,如:@Log4j


1.Lombok概念

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

2.安装Lombok

如何安装使用Lombok?

  • 方法一
    通过向lib文件夹中添加lombok.jar包即可,

  • 方法二 如果使用的是Maven,则可在项目的pom.xml文件中添加以下依赖:

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

Intellij Idea 识别Lombok方法:

File->settings->Plugins->Browse repositories->Lombok

3. 使用Lombok

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

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

最常用的就是@Data注解

自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法,toString方法。

@Data=@Setter + @Getter + @ToString + @EqualsAndHashCode+@RequiredArgsConstructor

该注解相当于同时加上以下五个注解:

@Setter @Getter,@ToString,@EqualsAndHashCode@RequiredArgsConstructor,作用于类中 使用:

@Data
public class Student {private String name;private String address;private String sex;private String email;private  int   age;
}

效果:

我们就可以通过类对象调用相应的get和set方法

public static void main(String[] args){Student student=new Student();student.setName("张三丰");student.getName();}
3.2 @Getter@Setter

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

public class Student {@Getter@Setterprivate String name;
}

等价源码:

public String getName() {return name;
}public void setName(String name) {this.name = name;
}
3.3 @NonNull

@NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常java.lang.NullPointerException

使用方法:

public class Person {private String name;@Setter@Getter@NonNullprivate List<Person> member;
}

源码:

@NonNull
private List<Person> members;public Family(@NonNull final List<Person> members) {if (members == null) throw new java.lang.NullPointerException("members");this.members = members;
}@NonNull
public List<Person> getMembers() {return members;
}public void setMembers(@NonNull final List<Person> members) {if (members == null) throw new java.lang.NullPointerException("members");this.members = members;
}
3.4 @Synchronized

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

private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");@Synchronized
public String synchronizedFormat(Date date) {return t.format(date);
}

生成等价源码:

Object lock = new Object();
private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");public String synchronizedFormat(Date date) {synchronized (lock) {return t.format(date);}
}
3.5 @ToString:自动生成toString()方法

方法我们都熟悉,但需要注意的是:@ToString有多个属性可以进一步设置:

  • callSuper 是否输出父类的toString方法,默认为false

  • includeFieldNames 是否包含字段名称,默认为true

  • exclude 排除生成tostring的字段

@ToString(callSuper = true,exclude ={"name"})
public class Person {private String name;private String address;
}

等价源码:

public String toString() {return "Person{" +"address='" + address + '\'' +'}';
}
3.6 @Cleanup

@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

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

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();}
}

等价源码:

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();}
}
3.7 @EqualsAndHashCode

@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集

当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能会出现问题,如下举例:

比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

解决方法:

  1. 使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。

  2. 使用@Getter ,@Setter @Tostring 代替 @Data 并自定义(重写) equals() 和 hashcode() 方法,比如有些类只需要判断主键 id 是否相等就够了。


参考博文:https://blog.csdn.net/u010695794/article/details/70441432

http://www.lryc.cn/news/242519.html

相关文章:

  • Tars框架 Tars-Go 学习
  • 基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序
  • 2015年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版
  • 优秀软件设计特征与原则
  • 设备管理系统-设备管理软件
  • 物联网AI MicroPython学习之语法 I2S音频总线接口
  • Day31| Leetcode 455. 分发饼干 Leetcode 376. 摆动序列 Leetcode 53. 最大子数组和
  • 基于C#实现赫夫曼树
  • Android 13.0 app进程保活白名单功能实现
  • 查找学习笔记
  • Qt QIODevice介绍
  • python -opencv 中值滤波 ,均值滤波,高斯滤波实战
  • 【教学类-06-07】20231124 (55格版)X-X之间的加法、减法、加减混合题
  • postgresql经常出现连接一会后服务器拒绝连接
  • 迈巴赫S480升级主动式氛围灯 浪漫婉转的气氛
  • Leetcode103 二叉树的锯齿形层序遍历
  • 可观测性建设实践之 - 日志分析的权衡取舍
  • Ceres使用
  • 深度学习第1天:深度学习入门-Keras与典型神经网络结构
  • 青云科技容器平台与星辰天合存储产品完成兼容性互认证
  • 谈谈基于Redis的分布式锁
  • 逸学java【初级菜鸟篇】10.I/O(输入/输出)
  • 【Python进阶笔记】md文档笔记第6篇:Python进程和多线程使用(图文和代码)
  • 基于Vue+SpringBoot的数字化社区网格管理系统
  • 【数据库设计和SQL基础语法】--数据库设计基础--数据建模与ER图
  • Vue3 设置点击后滚动条移动到固定的位置
  • 外部 prometheus监控k8s集群资源(pod、CPU、service、namespace、deployment等)
  • LLMLingua:集成LlamaIndex,对提示进行压缩,提供大语言模型的高效推理
  • 数据资产确权的难点
  • EMG肌肉电信号处理合集(二)