Lombok 使用介绍

Lombok java 神器

Posted by Yezhiwei on October 25, 2017

Lombok简介

Lombok是一个可以通过简单的注解形式来简化代码,消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。

官网地址

github地址

IntelliJ IDEA 使用它的方法

  • 先安装插件

安装插件

  • 在pom.xml文件中引入Lombok的jar包
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.14</version>
</dependency>

注解介绍及使用

  • @Getter and @Setter

可以用@Getter / @Setter注释任何字段,让Lombok自动生成默认的getter / setter方法。 默认生成的方法是public的,如果要修改方法修饰符可以设置AccessLevel的值,例如:@Getter(access = AccessLevel.PROTECTED)

Getter Setter

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

/**
 * Created by Yezhiwei on 17/10/26.
 */

public class User {

    @Getter(AccessLevel.PROTECTED)
    @Setter
    private Long id;

    @Getter
    @Setter
    private String name;

    @Getter
    @Setter
    private String password;

    @Getter
    @Setter
    private String phone;

}
  • @ToString

生成toString()方法,默认情况下,它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段,如密码 @ToString(exclude = "password") / @ToString(exclude = {"id","password"}) 如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:@ToString(callSuper = true)

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * Created by Yezhiwei on 17/10/26.
 */

@ToString(exclude = {"id", "password"})
public class User {

    @Getter
    @Setter
    private Long id;

    @Getter
    @Setter
    private String name;

    @Getter
    @Setter
    private String password;

    @Getter
    @Setter
    private String phone;


    // for test
    public static void main(String[] args) {

        User user = new User();
        user.setId(1L);
        user.setName("Yezhiwei");
        user.setPassword("123456");
        user.setPhone("13800138000");
        System.out.println(user);
    }
}

// 输出结果为:

User(name=Yezhiwei, phone=13800138000)

  • @EqualsAndHashCode

生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在parameter参数中命名它们来准确指定希望使用哪些字段。

  • @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

@NoArgsConstructor生成一个无参构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。

import lombok.NoArgsConstructor;
import lombok.NonNull;

@NoArgsConstructor(force = true)
public class User {
	@NonNull 
	private Integer id;
	
	@NonNull 
	private String name;
	
	private final String phone ;
}


@RequiredArgsConstructor会生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段 @RequiredArgsConstructor(staticName = "of")会生成一个of()的静态方法,并把构造方法设置为私有的

@AllArgsConstructor 生成一个全参数的构造方法

import lombok.AllArgsConstructor;
import lombok.NonNull;

@AllArgsConstructor
public class User {
	@NonNull private Integer id ;
	@NonNull private String name = "bbbb";
	private final String phone;
}

  • @Data

@Data 包含了@ToString@EqualsAndHashCode@Getter / @Setter@RequiredArgsConstructor的功能

Data

  • @Accessors

@Accessors 主要用于控制生成的getter和setter 主要参数介绍

fluent boolean值,默认为false。此字段主要为控制生成的getter和setter方法前面是否带get/set chain boolean值,默认false。如果设置为true,setter返回的是此对象,方便链式调用方法 prefix 设置前缀 例如:@Accessors(prefix = "abc") private String abcAge 当生成get/set方法时,会把此前缀去掉

  • @Synchronized

给方法加上同步锁

import lombok.Synchronized;
public class SynchronizedExample {
    private final Object readLock = new Object();

	@Synchronized
	public static void hello() {
	     System.out.println("world");
	}

	@Synchronized
	public int answerToLife() {
	     return 42;
	}
	
	@Synchronized("readLock")
	public void foo() {
	    System.out.println("bar");
	}
}

  • @Wither

提供了给final字段赋值的一种方法

//使用lombok注解的
import lombok.AccessLevel;
import lombok.NonNull;
import lombok.experimental.Wither;

public class WitherExample {
	@Wither 
	private final int age;
	
	@Wither(AccessLevel.PROTECTED) 
	@NonNull 
	private final String name;

	public WitherExample(String name, int age) {
		if (name == null) throw new NullPointerException();
		this.name = name;
		this.age = age;
	}
}

  • @Builder

@Builder注释为你的类生成复杂的构建器API。

//使用lombok注解的
import lombok.Builder;
import lombok.Singular;
import java.util.Set;

@Builder
public class BuilderExample {
	private String name;
	private int age;
	
	@Singular 
	private Set<String> occupations;
}

开发实践

Lombok是一个可以通过简单的注解形式来简化代码,消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。

但是,在实际的开发中Java对象一般与数据库中的字段一一对应,通过一些注解自动与数据库映射(ORM),既然使用@Data注解,那我们以前在getter上写的@Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") 等这些怎么办呢?

如,以前我们这样写:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

@Entity
@Table(name = "user")
public class User {

    private Long id;

    private String name;

    private String password;

    private String phone;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column(name = "password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Column(name = "phone")
    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

现在没有显示的GetterSetter 要怎么处理呢?

@onX 在注解里面添加注解的方式, 下面看代码:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

@Data
@ToString(exclude = {"id", "password"})
public class UserNew {

    @Getter(onMethod = @_({@Id, @Column(name = "id", nullable = false), @GeneratedValue(strategy = GenerationType.AUTO)}))
    private Long id;

    @Getter(onMethod = @_(@Column(name = "name")))
    private String name;

    @Getter(onMethod = @_(@Column(name = "password")))
    private String password;

    @Getter(onMethod = @_(@Column(name = "phone")))
    private String phone;
    
}

onX

更多的注解请看官方文档