专栏首页个人开发lombok在java项目中的使用

lombok在java项目中的使用

lombok简介

IDEA配置lombok

lombok常用的注解

@Getter/@Setter

@ToString

@NonNull

@EqualsAndHashCode

@NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor

@Data

@Cleanup

@Builder

lombok简介

lombok是一个java类库,能够自动植入开发者的编译器来辅助java开发。使用lombok,可以使用一个注解来代替getter等方法的编写。使用起来非常简单,maven pom.xml文件中加入如下依赖,

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
在实体类上加上注解@Data
@Data
public class Employee{

  private Long id;
  private String name;
  private String department;
  private Long number;
}

测试代码如下:

从图片中可以看出有编译错误代码,但是执行这个测试用例可以成功。

IDEA配置lombok

IDEA中安装lombok插件可以去除编译错误,跟安装普通插件一样,File->Settings->Plugins,如下图

重启后编译错误消失,注意点击下图中右下角的Enable按钮

lombok常用的注解

@Getter/@Setter

注解在类上,为所有非静态变量生产get和set方法

@ToString

注解在pojo类上面,为类生成toString方法,如果要在toString中排除一个变量,可以在该变量上面加上注解ToString.exclude,如果要在toString中打印出非静态变量,在非静态变量上增加@ToString.Include,如果要改变打印出的变量名称,在变量上加注解@ToString.Include(name = "username"),也可以通过@ToString.Include(rank = -1)来配置打印顺序,rank值越大越先打印 ·

如下示例:

@Setter
@ToString
public class ToStringExample {

    private static final int STATIC_VAR = 10;
    /**姓名**/
    private String name;
    private Square square = new Square(5, 10);
    private String[] tags;
    @ToString.Include(rank = 1)
    private static String password = "123456";
    @ToString.Exclude
    private int id;

    public String getName() {
        return this.name;
    }

    @ToString(callSuper=true)
    public static class Square {
        private final int width, height;

        public Square(int width, int height) {
            this.width = width;
            this.height = height;
        }
    }

    public static void main(String[] args){
        ToStringExample toStringExample = new ToStringExample();
        toStringExample.setName("jinjunzhu");
        toStringExample.setTags(new String[]{"123", "234"});
        System.out.println(toStringExample.toString());
    }
}点击并拖拽以移动

打印结果如下:

ToStringExample(password=123456, name=jinjunzhu, square=ToStringExample.Square(super=boot.lombok.ToStringExample$Square@446cdf90, width=5, height=10), tags=[123, 234])

@NonNull

检查借据是否为空,如果为空,抛出空指针异常

如下代码:

public class NonNullExample {

    private String name;

    public NonNullExample(@NonNull String name) {
        this.name = name;
    }

    public static void main(String[] args){
        NonNullExample nonNullExample = new NonNullExample(null);
    }
}点击并拖拽以移动

执行后结果如下:

@EqualsAndHashCode

为类生成equals(Object other)和hashcode()方法,默认为

non-static, non-transient生成,也可以用@EqualsAndHashCode.Include或@EqualsAndHashCode.Exclude来生成或不生成

如下2段代码等价

@EqualsAndHashCode
public class EqualsAndHashCodeExample {
    private transient int transientVar = 10;
    private String name;
    private double score;
    @EqualsAndHashCode.Exclude private Square shape = new Square(5, 10);
    private String[] tags;
    @EqualsAndHashCode.Exclude private int id;

    public String getName() {
        return this.name;
    }

    @EqualsAndHashCode()
    public static class Square {
        private final int width, height;

        public Square(int width, int height) {
            this.width = width;
            this.height = height;
        }
    }
}点击并拖拽以移动

这段代码等价于如下代码

public class EqualsAndHashCodeExample {
  private transient int transientVar = 10;
  private String name;
  private double score;
  private Shape shape = new Square(5, 10);
  private String[] tags;
  private int id;
  
  public String getName() {
    return this.name;
  }
  
  @Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof EqualsAndHashCodeExample)) return false;
    EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o;
    if (!other.canEqual((Object)this)) return false;
    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
    if (Double.compare(this.score, other.score) != 0) return false;
    if (!Arrays.deepEquals(this.tags, other.tags)) return false;
    return true;
  }
  
  @Override public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final long temp1 = Double.doubleToLongBits(this.score);
    result = (result*PRIME) + (this.name == null ? 43 : this.name.hashCode());
    result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
    result = (result*PRIME) + Arrays.deepHashCode(this.tags);
    return result;
  }
  
  protected boolean canEqual(Object other) {
    return other instanceof EqualsAndHashCodeExample;
  }
  
  public static class Square {
    private final int width, height;
    
    public Square(int width, int height) {
      this.width = width;
      this.height = height;
    }
    
    @Override public boolean equals(Object o) {
      if (o == this) return true;
      if (!(o instanceof Square)) return false;
      Square other = (Square) o;
      if (!other.canEqual((Object)this)) return false;
      if (!super.equals(o)) return false;
      if (this.width != other.width) return false;
      if (this.height != other.height) return false;
      return true;
    }
    
    @Override public int hashCode() {
      final int PRIME = 59;
      int result = 1;
      result = (result*PRIME) + super.hashCode();
      result = (result*PRIME) + this.width;
      result = (result*PRIME) + this.height;
      return result;
    }
    
    protected boolean canEqual(Object other) {
      return other instanceof Square;
    }
  }
}点击并拖拽以移动

@NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor

@NoArgsConstructor产生一个无参构造函数

@RequiredArgsConstructor将为没有给变量生产一个只有一个参数的构造函数

@AllArgsConstructor将生成一个有所有变量的构造函数,其中的staticName属性指定生产一个静态构造函数的名称,代码如下:

@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
    private int x, y;
    @NonNull
    private T description;

    @NoArgsConstructor
    public static class NoArgsExample {
        @NonNull private String field;
    }

    public static void main(String[] args){
        ConstructorExample<User> constructorExample1 = new ConstructorExample<User>(1, 1, new User());
        ConstructorExample<User> constructorExample2 = ConstructorExample.of(new User());
    }
}点击并拖拽以移动

@Data

是 @ToString, @EqualsAndHashCode, @Getter on all fields, @Setter在所有非final变量和@RequiredArgsConstructor的汇集功能,也就是说能为POJO类所有变量生成getters方法, 为所有非final方法生产setters, toString, equals和hashCode方法代码如下:

@Data
public class DataExample {
    private final String name;
    @Setter(AccessLevel.PACKAGE) private int age;
    private double score;
    private String[] tags;

    @ToString(includeFieldNames=true)
    @Data(staticConstructor="of")
    public static class Exercise<T> {
        private final String name;
        private final T value;
    }
}点击并拖拽以移动

@Cleanup

用于代码执行完成后自动释放资源,代码如下:

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

@Builder

引入一个复杂的构造函数,代码如下:

@Builder
public class BuilderExample {
    @Builder.Default
    private long created = System.currentTimeMillis();
    private String name;
    private int age;
    @Singular
    private Set<String> occupations;

    public static void main(String args){
        BuilderExample.builder().created(System.currentTimeMillis()).age(30).name("jinjunzhu");
    }
}

还有一些不常用的变量,不一一介绍了,大家参考如下链接:

https://projectlombok.org/features/all

文中源码地址:

https://github.com/jinjunzhu/spring-boot-mybatis.git

本文分享自微信公众号 - jinjunzhu(gh_1f109b82d301),作者:jinjunzhu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 行为型设计模式:策略模式

    策略模式是让策略的实现与策略的使用解耦,在我们日常的开发中,经常用来重构和优化if-else和switch语句。当然,策略模式并不是为了取代if-...

    jinjunzhu
  • 行为型设计模式:模板模式

    模板模式是常用的一种行为型设计模式,主要思想是在模板中定义一套流程骨架代码,并且不实现骨架代码中使用的一些方法,这些方法留给子类去实现。假如我们业务开发中...

    jinjunzhu
  • 行为型设计模式:责任链模式以及mybatis中的责任链

    职责链模式定义是把一个请求传递给多个对象来处理,这些对象都放在一条链上,以实现发送和接受解耦。GoF的《设计模式》中英文定义如下:

    jinjunzhu
  • 微信小程序推送模板消息

    ~~原来我用这个玩意用的老疯狂了。天天给我喜欢的女孩推送,我喜欢你。哈哈哈 比如xxx是女神了。哈哈哈 确实做一个程序员确实能给女朋友很多浪漫的地方。为了保护我...

    猿码优创
  • 快速使用Supervisor管理进程(程序自动重启)

    SeanCheney
  • Java——泛型基本总结(通配符、泛型接口、泛型方法)

    假如,现在定义一个表示坐标的类,Point,属性坐标x,y,但是此类设计特殊,现在由于设计特殊,现在实际使用中有可能出现以下三种结构的数据:

    Winter_world
  • 【小家java】Java中Apache Commons-lang3提供的Mutable接口提供可变的存储改变值

    所有已知实现Mutable接口的类有MutableBoolean, MutableByte, MutableDouble, MutableFloat, Muta...

    YourBatman
  • Go程序设计语言 1.1 Hello,World(2)

    ,他会帮你在命令行的当前目录下下载源代码。关于go get命令,我们在2.6章节和10.7章节将会详细讨论。

    用户2353021
  • 给函数取一个“好”的名字

    早在2013年,国外有个程序员做了一个有意思的投票统计,该投票是让程序员从以下几个选项中选出平时在工作中自己认为最难做的事情:

    Java团长
  • C++重要知识点小结---3

    C++重要知识点小结---1:http://www.cnblogs.com/heyonggang/p/3246631.html C++重要知识点小结---2:h...

    猿人谷

扫码关注云+社区

领取腾讯云代金券