一个酷酷的插件Lombok

一个酷酷的插件Lombok

Lombok可以增加一些处理程序,让java变得简单,灵活。他可以通过注解的方式,在编译是自动为属性生成构造器、getter/setter、equals、hashCode、toString方法。这个插件的神奇之处就在于,在源码中没有这些方法,但是在编译生成后的字节码文件中有这些方法。这样就使代码更加简洁,同时也省去了手动创建这些代码的麻烦

使用和安装方法

Lombok使用其实和jar一样,可以直接从官网上下载,也可以使用maven依赖。

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

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
</dependency>

在idea添加配置

在这里插入图片描述按照如图所示操作,进行安装插件(注:IDEA第一次使用时需要的操作)

编译器配置

选择默认的编译方式为 javac,因为 eclipse 是不支持 Lombok 的编译方式的,javac 支持 Lombok 的编译方式。
在这里插入图片描述

打开注解生成器

打开注解生成器 Enable annotation processing
在这里插入图片描述

有些版本默认不支持该插件的,需要去https://plugins.jetbrains.com/plugin/6317-lombok/versions 下载对应版本的插件,然后手动引入,在 IDEA 中选择 File -> Setting -> plugins 找到 Install Plugin from Disk…(注意版本不同位置可能有所差异)
在这里插入图片描述按照如图所示,安装即可,然后重启编译器。

注解使用

@Data

@Data 注解在类上,会为类的所有属性自动生成 setter/getter、equals、canEqual、hashCode、toString 方法,如为 final 属性,则不会为该属性生成 setter 方法。
在这里插入图片描述

@Getter/@Setter

如果觉得@Data 太过残暴(因为@Data 集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor 的所有特性)不够精细,可以使用@Getter/@Setter 注解,此注解在属性上,可以为相应的属性自动生成 set/get 方法。

public class Student {
    @Setter private String name;
    private Integer age;
    private Integer id;
    private String major;

    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("Mr.ml");
    }
}

@NonNull

该注解用在属性或构造器上,Lombok 会生成一个非空的声明,可用于校验参数,能帮助避免空指针

public class Student {
    @Setter private String name;
    private Integer age;
    private Integer id;
    private String major;

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

@Cleanup

该注解能帮助我们自动调用 close() 方法,很大的简化了代码。

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

@EqualsAndHashCode

默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成 equals 和 hashCode,也能通过 exclude 注解来排除一些属性。

@EqualsAndHashCode(exclude={"id", "shape"})
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;
    }

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

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

@ToString

类使用@ToString 注解,Lombok 会生成一个 toString() 方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。

通过将 includeFieldNames 参数设为 true,就能明确的输出 toString() 属性。这一点是不是有点绕口,通过代码来看会更清晰些。

@ToString(exclude="id")
public class ToStringExample {
    private static final int STATIC_VAR = 10;
    private String name;
    private Shape shape = new Square(5, 10);
    private String[] tags;
    private int id;

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

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

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

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

无参构造器、部分参数构造器、全参构造器。Lombok没法实现多种参数构造器的重载。

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

https://mp.weixin.qq.com/s/Sooz2KqgrRp7LFcxQiuqOg原文地址

发布了4 篇原创文章 · 获赞 0 · 访问量 3834

猜你喜欢

转载自blog.csdn.net/wei_weiwei/article/details/105552076
今日推荐