Lombok基本使用

举报
兮动人 发表于 2021/11/04 12:07:02 2021/11/04
【摘要】 Lombok基本使用

@[toc]

1. Lombok 是什么

  • 官网:https://projectlombok.org/

  • Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your 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.

  • 白话:Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 中的冗长代码,尤其是对于简单的 Java 对象(POJO),它通过注解实现这一目的。

  • 简化 JavaBean 开发

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>
  • idea中搜索安装lombok插件
    在这里插入图片描述
  • Lombok @Data 注解
  • 按快捷键 Alt+7就能显示当前类中的所有方法、全局常量,方法还包括形参和返回值
  • 或 view—>Tool Windows —>Structure—>点击

在这里插入图片描述

2. Lombok原理

  • JSR 269:插件化注解处理API(Pluggable Annotation Processing API)
  • 官网: https://www.jcp.org/en/jsr/detail?id=269
    JDK6提供的特性,在 Javac编译期利用注解
    在这里插入图片描述
  • 查看编译后的 User.class
    在这里插入图片描述
  • 原理实现流程图
    在这里插入图片描述

3. Lombok 常用注解

在这里插入图片描述

1. @Getter 和 @Setter 方法

  • 测试 @Setter 注解
    User.java
    在这里插入图片描述
    User.class
    在这里插入图片描述

  • 测试 @Getter(AccessLevel.PROTECTED) 注解,默认是 public ,可以设置不同方法的级别
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 给所有变量添加set、get方法,直接在类中注解
    在这里插入图片描述

  • 注意:

    1. lombok不会对 static 修饰的变量产生set、get方法
    2. lombok对 final 修饰的字符不会产生 set 方法
      在这里插入图片描述
      在这里插入图片描述
  • 自定义变量不生成 set、get方法
    在这里插入图片描述
    在这里插入图片描述

2. @ToString 方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 自定义排除某些字段的ToString 方法
    在这里插入图片描述
    在这里插入图片描述

3. @EqualsAndHashCode

在这里插入图片描述

  • 自定义排除某些字段的 EqualsAndHashCode方法
    在这里插入图片描述

4. @NonNull

  • 作用:注解的作用就是在方法中做了一次不为空的判断
  • 案例:
public void test(@NonNull String s){
        System.out.println(s);
}
public static void main(String[] args) {
        User user = new User();
        user.test(null);
    }
  • 结果:空指针
    在这里插入图片描述
  • 查看编译后的源代码:
public void test(@NonNull String s) {
        if (s == null) {
            throw new NullPointerException("s is marked non-null but is null");
        } else {
            System.out.println(s);
        }
    }
  • 也可以使用在构造函数里,也可以在字段中添加注解
@NotNull private Integer id;

5. @NoArgsConstructor 和 @RequiredArgsConstructor、 @AllArgsConstructor

  • @NoArgsConstructor,添加无参构造方法
    在这里插入图片描述
    在这里插入图片描述

  • @RequiredArgsConstructor,指定部分有参构造,默认会找标识了 @NonNull 的变量添加构造方法,或标识了 final 修饰的变量且没有赋予初始值添加构造方法
    在这里插入图片描述
    在这里插入图片描述

  • @AllArgsConstructor,生成所有成员变量的构造方法
    在这里插入图片描述
    在这里插入图片描述

6. @Data

  • 作用于类上,是以下注解的集合:@ToString ,@EqualsAndHashCode ,@Getter, @Setter @RequiredArgsConstructor

7. @Builder

  • 以字段名为方法名构造一系列的方法,而且方法返回的对象是UserBuilder

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. @Log

  • @Log:作用于类上,生成日志变量。针对不同的日志实现,有不同的注解:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

9. val

HashMap<String,String> map = new HashMap<String,String>();

简化的写法

val map = new HashMap<String,String>();
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<>();
}

10. @Cleanup

  • 用于关闭并释放资源,可以用在 IO 流上;
public class CleanupExample {
    public static void main(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream(args[0]);
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        byte[] b = new byte[10000];
        while (true) {
            int r = in.read(b);
            if (r == -1) break;
            out.write(b, 0, r);
        }
    }
}
  • 上面相当与如下传统的 Java 代码:
public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        if (out != null) {
          out.close();
        }
      }
    } finally {
      if (in != null) {
        in.close();
      }
    }
  }
}

4. 总结

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。