Lombok的使用-自动生成代码-getter/setter/trycatch等

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 等等…自己去慢慢探索吧, 哈哈哈哈….

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top