Lombok-高级篇

本文详细介绍了Lombok库中的各种注解,如@Getter、@Setter、@ToString、@EqualsAndHashCode等,包括它们的属性、用法以及在实际代码中的示例。通过对这些注解的学习,开发者可以更高效地减少样板代码,提高代码质量。
摘要由CSDN通过智能技术生成

Lombok入门知识,请戳《Lombok-入门篇


  • @Getter
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {

   lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
   
   AnyAnnotation[] onMethod() default {};
   
   boolean lazy() default false;
   
   @Deprecated
   @Retention(RetentionPolicy.SOURCE)
   @Target({})
   @interface AnyAnnotation {}
}

该注解可以标注在字段或类上。标注在字段上,将会给该字段构建标准的getter方法,比如字段为name,则方法名为getName,方法返回值与字段的类型对应。标注在类上,将会对类中的所有非静态字段构建getter方法。

属性解释:

(1)value

设置生成的getter方法的访问修饰符,默认为public。AccessLevel的可选值有PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,NONE分别对应访问权限为public、module(java9)、protected、default、private。NONE表示不生成getter方法,即停用注解功能。

比如,将getter方法设置成private:

// getter方法访问修饰符为private
@Getter(AccessLevel.PRIVATE)
public class User {

    private String name;

}

编译后:

public class User {
    private String name;

    public User() {
    }
    // 方法是private
    private String getName() {
        return this.name;
    }
}

(2)lazy

默认为false,当配置lazy=true时,@Getter注解只能标注在字段上,且该字段必须是private和final修饰的,也就是无法修改了。lazy的含义是只有调用get方法的时候,才会对属性赋值。

源码:

public class User {

    @Getter(value = AccessLevel.PUBLIC, lazy = true)
    private final String name = "hello";

}

编译后:

import java.util.concurrent.atomic.AtomicReference;

public class User {
    private final AtomicReference<Object> name = new AtomicReference();

    public User() {
    }

    public String getName() {
        Object value = this.name.get();
        if (value == null) {
            synchronized(this.name) {
                value = this.name.get();
                if (value == null) {
                    String actualValue = "hello";
                    value = "hello" == null ? this.name : "hello";
                    this.name.set(value);
                }
            }
        }

        return (String)((String)(value == this.name ? null : value));
    }
}

(3)onMethod

构建在方法上添加注解,是一个还处于实验中的功能,暂不讨论。

使用规则:

(1)标注在字段上

源码:

public class User {

    @Getter
    private String name;

    @Getter
    private static int age;
    
}

编译后:

public class User {
    private String name;
    private static int age;

    public User() {
    }

    public String getName() {
        return this.name;
    }

    public static int getAge() {
        return age;
    }
}

当在字段上使用时,是不区分静态和非静态字段的,均可以构建getter方法。

(2)标注在类上

源码:

@Getter
public class User {

    private String name;

    private static int age;

}

编译后:

public class User {
    private String name;
    private static int age;

    public User() {
    }

    public String getName() {
        return this.name;
    }
}

当在类上使用时,不会对静态字段构建getter方法。

(3)已经自定义实现了getXx方法,是否会覆盖:

源码:

@Getter
public class User {

    private String name;

    public int getName() {
        return name.hashCode();
    }
    
}

编译后:

public class User {
    private String name;

    public User() {
    }

    public int getName() {
        return this.name.hashCode();
    }
}

Lombok不会覆盖已经显示定义的同名方法,虽然自定义的getName方法不是标准的getter方法,返回值不是name的String类型。此条规则也适应于其他注解。

  • @Setter
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
 
   lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;
   
   AnyAnnotation[] onMethod() default {};
   
   AnyAnnotation[] onParam() default {};

   @Deprecated
   @Retention(RetentionPolicy.SOURCE)
   @Target({})
   @interface AnyAnnotation {}
}

该注解可以标注在字段与类上。标注在字段上,将会给该字段构建标准的setter方法,比如字段为name,则方法名为setName或isName,方法返回值与字段的类型对应。标注在类上,将会对类中的所有非静态字段、非final字段构建setter方法。

属性解释:

(1)valueonMethod作用与@Getter相同。

(2)onParam

对setter方法的参数添加注解,也是一个处于实验中的功能。

使用规则:

(1)与@Getter的区别是,@Setter注解不会对final修饰的属性构建方法,而@Getter可以。

源码:

@Setter
@Getter
public class User {

    private final String name = "hello";

}

编译后:

public class User {
    private final String name = "hello";

    public User() {
    }

    public String getName() 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值