自学内容网 自学内容网

Lombok的使用

1、什么是lombok

lombok是一种实用的工具,可以用来帮助开发人员消除Java中的冗余代码,尤其是对于简单的Java对象(POJO),它通过注解达到这一目的。

2、Lombok常用注解

2.1 @Getter/@Setter

从名字上理解,相当于为成员变量生成对应的 get 和 set 方法,同时还可以指定修饰符【默认是public】

public class Dog {
 
    @Getter
    @Setter
    private Integer age;
 
    @Getter(AccessLevel.PROTECTED)
    private String name;
}

这两个注解还可以直接用在类上,可以为类里面的所有非静态成员变量生成对应的 get 和 set 方法

2.2 @ToString

本质就是生成toString方法【生成方法时会使用类中的非静态和非 transient 成员变量】

@ToString
public class Dog {

    private Integer age;
    private String name;
}

2.3 @EqualsAndHashCode

生成 equals 和 hashcode 方法,同时还会生成 canEqual 方法,用于判断某个对象是否是当前类及其子类的实例【生成方法时会使用类中的非静态和非 transient 成员变量】

@EqualsAndHashCode
public class Dog {
 
    private Integer age;
    private String name;
}

实际效果相当于:

public class Dog {
    private Integer age;
    private String name;
 
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof Dog)) return false;
        Dog other = (Dog) o;
        if (!other.canEqual(this)) return false;
        Object this$age = this.age, other$age = other.age;
        if ((this$age == null) ? (other$age != null) : !this$age.equals(other$age)) return false;
        Object this$name = this.name, other$name = other.name;
        return !((this$name == null) ? (other$name != null) : !this$name.equals(other$name));
    }
 
    protected boolean canEqual(Object other) {
        return other instanceof Dog;
    }
 
    public int hashCode() {
        int PRIME = 59;
        result = 1;
        Object $age = this.age;
        result = result * 59 + (($age == null) ? 43 : $age.hashCode());
        Object $name = this.name;
        return result * 59 + (($name == null) ? 43 : $name.hashCode());
    }
 
}

2.4 @NonNull

public class Dog {
 
    private static Integer age;
    private String name;
 
    public void setName(@NonNull String names){
        this.name = names;
    }
}

实际效果相当于:

public class Dog
{
    private static Integer age;
    private String name;
    
    public void setName(@NonNull String names) {
        if (names == null) throw new NullPointerException("names"); 
        this.name = names;
    }
}

2.5 @NoArgsConstructor、@RequiredArgsConstructor 、@AllArgsConstructor

1.作用

@NoArgsConstructor:为该类产生无参的构造方法

@RequiredArgsConstructor:使用类中所有带有 @NonNull 注解的或者带有 final 修饰的成员变量生成对应的构造方法

@AllArgsConstructor:为该类产生包含所有参数的构造方法

2.示例

@RequiredArgsConstructor(staticName = "sunfire")
@AllArgsConstructor
public class Dog {
 
    private static Integer age;
 
    @NonNull
    private String name;
 
    private String type;
 
    private final String res;
}

实际效果相当于:

public class Dog {
    private static Integer age;
    @NonNull
    private String name;
    private String type;
    private final String res;
 
    private Dog(@NonNull String name, String res) {
        if (name == null) throw new NullPointerException("name");
        this.name = name;
        this.res = res;
    }
 
    public static com.luoyu.aiyu.luo1.Dog sunfire(@NonNull String name, String res) {
        return new com.luoyu.aiyu.luo1.Dog(name, res);
    }
 
    @ConstructorProperties({"name", "type", "res"})
    public Dog(@NonNull String name, String type, String res) {
        if (name == null) throw new NullPointerException("name");
        this.name = name;
        this.type = type;
        this.res = res;
    }
 
}

注意

  • 和前面几个注解一样,成员变量都是非静态的,另外,如果类中含有final修饰的成员变量,是无法使用@NoArgsConstructor注解的。
  • 三个注解都可以指定生成的构造方法的访问权限。
  • 第二个注解还可以用@RequiredArgsConstructor(staticName=”methodName”)的形式额外生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象。

2.6 @Data

综合了@Getter、@Setter、@toString、@EqualsAndHashCode、@NoArgsConstructor注解。

如果同时加了@Data注解和@AllArgsConstructor注解,那么@Data注解提供的无参构造会被覆盖掉,所以建议在这二个注解同时存在的时候,建议再加一个@NoArgsConstructor注解。

2.7 @Builder

可以自动为类生成一个建造者模式的实现,以链式调用的形式创建对象、添加属性来简化对象构建过程。要注意的是,如果在类上添加@Builder注解和@NoArgsConstructor注解会产生冲突,因为一方要求生成带参数的构造函数,另一方要求生成无参构造函数。但是,可以@Builder 、@AllArgsConstructor、@NoArgsConstructor三者可以同时使用。

import lombok.Builder;

@Builder
public class User {
    private Long id;
    private String name;
    private Integer age;
}

实际效果:

public class User {
    private Long id;
    private String name;
    private Integer age;

    public User(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public static UserBuilder builder() {
        return new UserBuilder();
    }

    public static class UserBuilder {
        private Long id;
        private String name;
        private Integer age;

        public UserBuilder id(Long id) {
            this.id = id;
            return this;
        }

        public UserBuilder name(String name) {
            this.name = name;
            return this;
        }

        public UserBuilder age(Integer age) {
            this.age = age;
            return this;
        }

        public User build() {
            return new User(id, name, age);
        }
    }
}


原文地址:https://blog.csdn.net/m0_59749089/article/details/138002366

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!