@lombok从源码层面学习


概述

lombok我们主要用来减少get、set和空参和全参的重复性代码,本文希望深入学习来理解其原理和避免一些坑。其官网描述1为:

Project Lombok aims to reduce the prevalence of some of the worst offenders by replacing them with a simple set of annotations.
(Project Lombok 旨在通过用一组简单的注解替换一些最严重的违例来减少它们的流行。)

关键字:lombok学习,@Getter ,@Setter,@NonNull,@ToString,@EqualsAndHashCode,@Data,@Cleanup,@Synchronized,@SneakyThrows

环境

  • jdk:1.8
  • projectlombok:1.18.24

注解

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

@Getter 、@Setter

@Getter

@Getter注解用来生成成员变量的get方法。

@Getter private String catName

等效于java代码:

private String catName;
public String getCatName() {
   
	return this.catName;
    }

其中@Getter包含三个可选参数value(default lombok.AccessLevel.PUBLIC)、onMethod(default {})、lazy(default false)

  1. value是用来指定生成的get方法的访问级别,默认为public,可以使用提供的访问级别枚举进行指定

    public enum AccessLevel {
         
    	PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,
    	/** Represents not generating anything or the complete lack of a method. */
    	NONE;
    }
    

    比如指定为private

    @Getter(value = AccessLevel.PRIVATE) private String catName;
    

    等效于java代码

    private String catName;
    private String getCatName() {
         
        return this.catName;
    }
    
  2. onMethod的类型是AnyAnnotation[ ],在生成的getter方法上加上特定的注解列表(例子中的@Interface仅代表是注解,并无实际含义),注意onMethod后面的下划线。

    @Getter(onMethod_ = @Interface)
    private String catName;
    

    等效于java代码

    private String catName;
    @Interface
    public String getCatName() {
         
        return this.catName;  
    }
    
  3. lazy这个属性默认为false,类似于单例模式的懒加载,当实例化该类比较耗时,且占用较大的空间时,我们不希望频繁的创建新的实例,而使用lazy进行修饰字段时,这个字段相对于其它字段部分会隐藏起来,使用一个原子缓存,并且不需要进行并发锁的处理,因为lombok会进行锁的操作,在get的时候会进行双重检验来创建对象,注意lazy修饰的字段必须是final类型,所以需要进行初始化。

    @Getter(lazy = true)
    private final String catName = "Tom";
    

    等效于java代码

    private final AtomicReference<Object> catName = new AtomicReference();
        public String getCatName() {
         
            Object value = this.catName.get();
            if (value == null) {
         
                synchronized(this.catName) {
         
                    value = this.catName.get();
                    if (value == null) {
         
                        String actualValue = "Tom";
                        value = "Tom" == null ? this.catName : "Tom";
                        this.catName.set(value);
                    }
                }
            }
            return (String)((String)(value == this.catName ? null : value));
        }
    

@Setter

@Setter注解是用来生成成员变量的set方法

@Setter private String dogName;

等效于java代码

private St
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值