当前位置: 代码迷 >> 综合 >> Lombok--简化代码
  详细解决方案

Lombok--简化代码

热度:107   发布时间:2023-11-19 23:39:27.0

一:在开发工具中安装插件:

Eclipse:
下载地址:lombok
将下载的lombok.jar文件,放到eclipse安装路径,该jar包也就是lombok插件的jar文件了
打开eclipse.ini文件,添加如下内容:

-javaagent:lombok.jar
-Xbootclasspath/a:lombok.jar

重启eclipse

IDEA:
可以在线安装lombok的插件
settings -> plugins -> 在搜索框输入lombok -> 安装

二:在pom.xml中,引入依赖

 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

三:Lombok用法

注解说明

  • val:用在局部变量前面,相当于将变量声明为final
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<>();
}
  • @NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException)
public void notNullExample(@NonNull String string) {string.length();
}//=>相当于public void notNullExample(String string) {if (string != null) {string.length();} else {throw new NullPointerException("null");}
}
  • @Cleanup:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成try-finally这样的代码来关闭流
public static void main(String[] args) {try {@Cleanup InputStream inputStream = new FileInputStream(args[0]);} catch (FileNotFoundException e) {e.printStackTrace();}//=>相当于InputStream inputStream = null;try {inputStream = new FileInputStream(args[0]);} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}
}
  • @Getter/@Setter:用在属性上,再也不用自己手写setter和getter方法了,还可以指定访问范围
@Setter(AccessLevel.PUBLIC)
@Getter(AccessLevel.PROTECTED)
private int id;
private String shap;
  • @ToString:用在类上,可以自动覆写toString方法,当然还可以加其他参数,

例如@ToString(exclude=”id”)排除id属性,或者@ToString(callSuper=true, includeFieldNames=true)调用父类的toString方法,包含所有属性

@ToString(exclude = "id", callSuper = true, includeFieldNames = true)
public class LombokDemo {private int id;private String name;private int age;public static void main(String[] args) {//输出LombokDemo(super=LombokDemo@48524010, name=null, age=0)System.out.println(new LombokDemo());}
}
  • @EqualsAndHashCode:用在类上,自动生成equals方法和hashCode方法
@EqualsAndHashCode(exclude = {"id", "shape"}, callSuper = false)
public class LombokDemo {private int id;private String shap;
}
  • @NoArgsConstructor, @RequiredArgsConstructor , @AllArgsConstructor:用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有@NonNull属性作为参数的构造函数,如果指定staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多
@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class LombokDemo {@NonNullprivate int id;@NonNullprivate String shap;private int age;public static void main(String[] args) {new LombokDemo(1, "circle");//使用静态工厂方法LombokDemo.of(2, "circle");//无参构造new LombokDemo();//包含所有参数new LombokDemo(1, "circle", 2);}
}
  • @Data:注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用

在IntelliJ中按下Ctrl+F12就可以看到Lombok已经为我们自动生成了一系列的方法。

import lombok.Data;
@Data
public class Menu {private String shopId;private String skuMenuId;private String skuName;private String normalizeSkuName;private String dishMenuId;private String dishName;private String dishNum;//默认阈值private float thresHold = 0;//新阈值private float newThresHold = 0;//总得分private float totalScore = 0;
}
  • @Value:用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法
@Value
public class LombokDemo {@NonNullprivate int id;@NonNullprivate String shap;private int age;//相当于private final int id;public int getId() {return this.id;}...
}
  • @Builder:用在类、构造器、方法上,为你提供复杂的builder APIs,让你可以像如下方式一样调用Person.builder().name(“Adam Savage”).city(“San Francisco”).job(“Mythbusters”).job(“Unchained Reaction”).build();更多说明参考Builder
@Builder
public class BuilderExample {private String name;private int age;@Singularprivate Set<String> occupations;public static void main(String[] args) {BuilderExample test = BuilderExample.builder().age(11).name("test").build();}
}
  • @SneakyThrows:自动抛受检异常,而无需显式在方法上使用throws语句
import lombok.SneakyThrows;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
public class Test {@SneakyThrows()public void read() {InputStream inputStream = new FileInputStream("");}@SneakyThrowspublic void write() {throw new UnsupportedEncodingException();}//相当于public void read() throws FileNotFoundException {InputStream inputStream = new FileInputStream("");}public void write() throws UnsupportedEncodingException {throw new UnsupportedEncodingException();}
}
  • @Synchronized:用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性lock或lock或lockLOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误
public class SynchronizedDemo {@Synchronizedpublic static void hello() {System.out.println("world");}//相当于private static final Object $LOCK = new Object[0];public static void hello() {synchronized ($LOCK) {System.out.println("world");}}
}
  • @Getter(lazy=true):可以替代经典的Double Check Lock样板代码
public class GetterLazyExample {@Getter(lazy = true)private final double[] cached = expensive();private double[] expensive() {double[] result = new double[1000000];for (int i = 0; i < result.length; i++) {result[i] = Math.asin(i);}return result;}
}
import java.util.concurrent.atomic.AtomicReference;
public class GetterLazyExample {private final AtomicReference<java.lang.Object> cached = new AtomicReference<>();public double[] getCached() {java.lang.Object value = this.cached.get();if (value == null) {synchronized (this.cached) {value = this.cached.get();if (value == null) {final double[] actualValue = expensive();value = actualValue == null ? this.cached : actualValue;this.cached.set(value);}}}return (double[]) (value == this.cached ? null : value);}private double[] expensive() {double[] result = new double[1000000];for (int i = 0; i < result.length; i++) {result[i] = Math.asin(i);}return result;}
}
  • @Log:根据不同的注解生成不同类型的log对象,但是实例名称都是log,有六种可选实现类
    • @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
    • @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
    • @Log4j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);
    • @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
    • @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
    • @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
// SpringBoot 下
@Log
public class LombokDemo{log.info("加上注解后,可直接使用。需要打印的消息!");
}//相当于public class LombokDemo{// 1. create log  2. get log config file  3.start logpublic  static Log log = LogFactory.getLog(TestLog.class);  log.info("没加注解需要手动创建。需要打印的消息!");
}