七、IDEA安装lombok及使用详解

it2024-04-08  48

1、官方介绍

官网

官方下载地址(lombok.jar)

简介

任何技术的出现都是为了解决某一类问题,以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,因此,Lombok应运而生。

Lombok的优缺点

优点:

能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率让代码变得简洁,不用过多的去关注相应的方法属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:

不支持多种参数构造器的重载虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

2、使用

引入Lombok

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <!-- Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中 --> <scope>provided</scope> </dependency>

IEDA添加Lombok插件支持

常用注解

@Data注解在类上,会为类的所有属性自动生成的getting、setting、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。 @Data public class DataExample { private final String name; private int age; private double score; private String[] tags; } @Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。@Getter& @Setter:注解在属性上;为属性提供getting&setting方法 public class GetterSetterExample { @Getter @Setter private int age = 10; @Setter(AccessLevel.PROTECTED) private String name; @Override public String toString() { return String.format("%s (age: %d)", name, age); } } @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; } } } @EaqusAndHashCode:默认情况下,会使用所有非静态-non-static和非瞬态-non-transient属性来生成equals和hasCode,也能通过@exclude注解来排除一些属性 import lombok.EqualsAndHashCode; @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; } } } @Log4j :注解在类上;为类提供一个 属性名为log的log4j日志对象@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; } } @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); } } } @Builder : 被注解的类加个构造者模式@Synchronized : 加个同步锁@SneakyThrows : 等同于try/catch 捕获异常@NonNull : 该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。 public class NonNullExample extends Something { private String name; public NonNullExample(@NonNull Person person) { super("Hello"); this.name = person.getName(); } }

3、总结

Lombok更类似于一种IDE插件变向的说Lombok在改变java语法Lombok是编译时的特性,不是运行时的特性,从语言和技术上讲非必要。改变了如何编写源码相较于IED工具的快捷键只是锦上添花有能力完全阅读Lombok源码的、@Getter& @Setter等一系列被Lombok封装的方法已经烂熟于心,可以变着花样玩的高手可以用!否则不建议用!
最新回复(0)