栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@lombok从源码层面学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@lombok从源码层面学习

文章目录
    • 概述
    • 环境
    • 注解
    • @Getter 、@Setter
      • @Getter


概述

lombok我们主要用来减少get、set和空参和全参的重复性代码,本文希望深入学习来理解其原理和避免一些坑。本文涉及到的所有代码均放在了我的码云上,有兴趣的可以点个star。其官网描述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,
    	
    	NONE;
    }
    

    比如指定为private

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

    等效于java代码

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

    @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 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));
        }
      
    

    ------------------To Be Continued


    1. Michael Kimberlin. REDUCING BOILERPLATE CODE WITH PROJECT LOMBOK[EB/OL]. 2010.1[2022.5.13]. https://objectcomputing.com/resources/publications/sett/january-2010-reducing-boilerplate-code-with-project-lombok. ↩︎

    转载请注明:文章转载自 www.mshxw.com
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号