Lombok入门

Lombok

官方文档:https://projectlombok.org/features/all

解决的痛点问题

原始的java object(POJO)

  • private fields,每一个field都需要有setter/getter方法
  • constructor
  • toString() method
  • finally bock
    这些代码都是可以优化的

优势

  • 通过注解方式,优化了冗余代码
  • 和主流的IDE结合的很好

主要内容

check for Nulls
@NonNull @Setter
private String employeeId;

等价于

public id setEmployeeId(@NonNull final String employeeId){
	if(employeeId == null) throw new java.lang.NullPointerException("employeeId");
	this.employeeId = employeeId;
}	
Concise Data Objects
@Getter @Setter private String columnName;

等价于

private String columnName;

public String getColumnName(){
	return this.columnName;
}
public void setColumnName(String columnName){
 	this.columnName = columnName;
}

其他注解

@EqualsAndHashCode
@ToString(exclude={"columnLabel"})
public class ColumnBean {
	private BigDecimal id;
	private String columnName;
	private String columnLabel;
}

@Data
public class ColumnBean {
	@NonNull
	private BigDecimal id;
	@NonNull
	private String columnName;
	@NonNull
	private String columnLabel;
}

@Data

  • 为所有non-static的属性生成getter/setter

  • 多个构造函数(所有参数,任意参数,非空的field参数)

  • toString()

  • equals()

  • hashcode()

      @AllArgsConstructor
      @NoArgsConstructor
      @RequiredArgsConstructor
    

Builder

当一个object有很多属性的时候,传统的构造函数传入很多参数,易读性差,使用builder的可读性更好。
Object对外暴露getter操作,不暴露setter,通过builder来set值

@Builder
public class Officer {
	private final String id;
	private final String name;
	private final int age;
	private final String department;
}

//创建对象
Officer officer = Officer.builder()
							.id("00001")
							.name("simon qi")
							.age(26)
							.department("departmentA")
							.build();

toBuilder = true, 表示允许修改原对象。默认为false

officer = officer.toBuilder()
		        	.id("00002")
		        	.build();

Clean up

容易清理资源。例如关闭资源

@Cleanup InputStream inputStream = new FileInputStream(args[0]);
@Cleanup OutputStream outputStream = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
    int r = inputStream.read(b);
    if (r == -1) break;
    outputStream.write(b, 0, r);
}

等价于

InputStream in = new FileInputStream(args[0]);
    try {
        OutputStream out = new FileOutputStream(args[1]);
        try {
            byte[] b = new byte[10000];
            while (true) {
                int r = in.read(b);
                if (r == -1) {
                    break;
                }
                out.write(b, 0, r);
            }
        } finally {
            if (out != null) {
                out.close();
            }
        }
    } finally {
        if (in != null) {
            in.close();
        }
    }

Lock

保证同一时刻,只有一个thread可以执行这个方法。注解仅可以用于static和instance方法。

@Synchronized
public static void helloLombok(){
	System.out.println("Lombok");
}

Logging

@Log4j2
public class ClassName(){
. . .
// Use log variable as needed
}

等价于

public class ClassName(){
private static final org.apache.log4j.Logger log =
	org.apache.log4j.Logger.getLogger(ClassName.class); 
	. . .
	// Use log variable as needed
}

Exception

对于一些必须catch异常的地方,但是又不做特殊处理,只想throw exception是,可以使用@SneakyThrows

@SneakyThrows
public void run() {
	throw new Throwable();
}

等价于

public void run() {
	try {
 	 throw new Throwable();
	} catch (Throwable t) {
  	throw Lombok.sneakyThrow(t);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值