Lombok 介绍
Lombok 是一个通过编译器时注入代码的开源库, 在 GitHub 上有3k+的好评, 可以点击这里去 GitHub 上进一步了解.
它可以通过一个注解帮你省去繁琐的JavaBean 中的 Getter/Setter/Constructor 等代码, 非常方便, 让代码变得简洁, 容易维护.
由于是在编译器对字节码进行修改, 所以不需要担心性能问题.
项目中集成Lombok
以 IntelliJ IDEA 2016为例子, 打开 setting -> Plugins -> Browse repositories 插件管理界面, 通过搜索找到 lombok 进行安装, 成功后需要重新启动 IDEA.
(Note: 有时候需要启用 IDEA 的 annotation 选项. Build.. -> Complier -> Annotation Processors -> Enable annotation processing 勾上)
然后添加 lombok 的项目依赖:
Maven:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version> </dependency>
Gradle:
compile group: 'org.projectlombok', name: 'lombok', version: '1.16.12'
Lombok 使用-常用的注解
@Getter/@Setter
public class GetterSetterExample { @Getter @Setter private int age = 10; } 或者 @Getter @Setter public class GetterSetterExample { private int age = 10; }
你就可以直接使用这个 bean 的 getter/setter 方法啦
GetterSetterExample bean = new GetterSetterExample(); bean.setAge(11) bean.getAge();// 11
它的名字默认是字段的名字驼峰命名,当然你可以修改, 也可以规定它的权限为 public 的还是 private 的, 更甚者可以定义为 static 的等等
@Setter(AccessLevel.PROTECTED) private String name;
其中@Getter 注解中的 lazy = true 的话, 更可以实现 bean 的延迟初始化功能, 非常强大:
public class GetterLazyExample { @Getter(lazy=true) private final double[] cached = expensive(); private double[] expensive() { //做一些计算... return ...; } }
反编译后, 你会发现它生成的代码是这样的:
public class GetterLazyExample { private final java.util.concurrent.AtomicReference<java.lang.Object> cached = new java.util.concurrent.AtomicReference<java.lang.Object>(); 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() { //计算... return ...; } }
@ToString/@EqualsAndHashCode
很明显, 帮我们自动生成 toString 方法和 equals 方法, 免得每次日志打出来都是指针, 看不懂.
@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; }
@Data
这个注解很简单, 如果写在类上面, 就相当于写了 @Getter/@Setter/@ToString/@EqualsAndHashCode 了, 是个”套餐”, 哈哈
@Cleanup
这个是用在Java IO流上面的, 它会帮我们自动生成 try catch finally 代码, 并在里面自动 close IO 流, 代码就看上去很简洁, IDEA 也不会提示你 try catch IO 异常了:
@Cleanup InputStream in = new FileInputStream(obj);
当然你也可以用 Java7自带的 closable 去 auto close IO 流, 但你始终逃不掉 try catch 的代码. 用@cleanup 吧, 哈哈
@Log
自动注入一个 logger 对象去记录日志, 可以自定义使用哪种日志框架
@Log public class LogExample { public void method() { //可以直接使用 log 对象 log.error("Something's wrong here"); } }
@SneakyThrows
帮你解决代码中抛出异常这件事. 在某个方法中, 需要 try catch 一个异常, 你又不想显示的 throw这个异常, 那么久交给这个注解吧, 在方法上写上后, 需要捕获异常的错误提示马上消失.
其他注解:
@Builder 帮你生成一个 Builder 模式的类
@NoArgsConstructor
, @RequiredArgsConstructor
,@AllArgsConstructor 帮你实现各种构造函数
@Synchronized 帮你方法加锁
还有@Value val @UtilClass 等等…自己去慢慢探索吧, 哈哈哈哈….