Lombok简介
Lombok是一个可以通过简单的注解形式来简化代码,消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
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)
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
的功能
- @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;
}
}
现在没有显示的Getter
和 Setter
要怎么处理呢?
@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;
}