【Lombok使用详解】

目录

      • 前言:注解速查
      • 1.Lombok概念
      • 2.安装Lombok
      • 3. 使用Lombok
        • 3.1 @Data
        • 3.2 @Getter@Setter
        • 3.3 @NonNull
        • 3.4 @Synchronized
        • 3.5 @ToString:自动生成toString()方法
        • 3.6 @Cleanup
        • 3.7 @EqualsAndHashCode

前言:注解速查

  • @NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常

  • @CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

  • @Setter/@Getter : 自动生成set和get方法

  • @ToString : 自动生成toString方法

  • @EqualsAndHashcode : 从对象的字段中生成hashCode() 方法和equals()方法的实现

  • @NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
    自动生成构造方法

  • @Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法

  • @Value : 用于注解final类

  • @Builder : 产生复杂的构建器api类

  • @SneakyThrows : 异常处理(谨慎使用)

  • @Synchronized : 同步方法安全的转化

  • @Getter(lazy=true) :

  • @Log: 支持各种logger对象,使用时用对应的注解,如:@Log4j


1.Lombok概念

Lombok是一个通过注解以达到减少代码的Java库,(或者说是一个插件)如通过注解的方式减少get,set方法,构造方法等。

2.安装Lombok

如何安装使用Lombok?

  • 方法一
    通过向lib文件夹中添加lombok.jar包即可,

  • 方法二 如果使用的是Maven,则可在项目的pom.xml文件中添加以下依赖:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.12</version>
    </dependency>
    

Intellij Idea 识别Lombok方法:

File->settings->Plugins->Browse repositories->Lombok

3. 使用Lombok

Lombok提供注解方式来提高代码的简洁性,常用注解有:

  • @Data
  • @Setter @Getter
  • @NonNull
  • @Synchronized
  • @ToString
  • @EqualsAndHashCode
  • @Cleanup
  • @SneakyThrows
3.1 @Data

最常用的就是@Data注解

自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法,toString方法。

@Data=@Setter + @Getter + @ToString + @EqualsAndHashCode+@RequiredArgsConstructor

该注解相当于同时加上以下五个注解:

@Setter @Getter,@ToString,@EqualsAndHashCode@RequiredArgsConstructor,作用于类中 使用:

@Data
public class Student {
    private String name;
    private String address;
    private String sex;
    private String email;
    private  int   age;
}

效果:

我们就可以通过类对象调用相应的get和set方法

public static void main(String[] args){
    Student student=new Student();
    student.setName("张三丰");
    student.getName();
 }
3.2 @Getter@Setter

作用于属性上,自动生成get,set方法.

public class Student {
    @Getter@Setter
    private String name;
}

等价源码:

public String getName() {
    return name;
}

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

@NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常java.lang.NullPointerException

使用方法:

public class Person {

    private String name;

    @Setter@Getter@NonNull
    private List<Person> member;
}

源码:

@NonNull
private List<Person> members;

public Family(@NonNull final List<Person> members) {
    if (members == null) throw new java.lang.NullPointerException("members");
    this.members = members;
}
    
@NonNull
public List<Person> getMembers() {
    return members;
}

public void setMembers(@NonNull final List<Person> members) {
    if (members == null) throw new java.lang.NullPointerException("members");
    this.members = members;
}
3.4 @Synchronized

该注解自动添加到同步机制,生成的代码并不是直接锁方法,而是锁代码块, 作用范围是方法上
使用方法:

private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");

@Synchronized
public String synchronizedFormat(Date date) {
    return t.format(date);
}

生成等价源码:

Object lock = new Object();
private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");

public String synchronizedFormat(Date date) {
    synchronized (lock) {
        return t.format(date);
    }
}
3.5 @ToString:自动生成toString()方法

方法我们都熟悉,但需要注意的是:@ToString有多个属性可以进一步设置:

  • callSuper 是否输出父类的toString方法,默认为false

  • includeFieldNames 是否包含字段名称,默认为true

  • exclude 排除生成tostring的字段

@ToString(callSuper = true,exclude ={"name"})
public class Person {
    private String name;
    private String address;
}

等价源码:

public String toString() {
 return "Person{" +
                "address='" + address + '\'' +
    '}';
}
3.6 @Cleanup

@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

注释可用于确保已分配的资源被释放,如IO的连接关闭。
使用方法:

public void testCleanUp() {
    try {
        @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
        baos.write(new byte[] {'Y','e','s'});
        System.out.println(baos.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

等价源码:

public void testCleanUp() {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            baos.write(new byte[]{'Y', 'e', 's'});
            System.out.println(baos.toString());
        } finally {
            baos.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
3.7 @EqualsAndHashCode

@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集

当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能会出现问题,如下举例:

比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

解决方法:

  1. 使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。

  2. 使用@Getter ,@Setter @Tostring 代替 @Data 并自定义(重写) equals() 和 hashcode() 方法,比如有些类只需要判断主键 id 是否相等就够了。


参考博文:https://blog.csdn.net/u010695794/article/details/70441432

你可能感兴趣的:(SpringBoot,java,maven,spring,boot,servlet,mybatis,spring,cloud)