Java 类库:Lombok

前言

  前阵子闲逛的时候,留意到了Lombok这个Java第三方库,后来亲自试用了一下,还真有一种相见恨晚的感觉,对于博主这样的懒人来说,这简直是太实用了。这不趁周末,赶紧把好东西写出来分享一下。

Lombok

引述官网介绍:

  Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again. Early access to future java features such as val, and much more.
  Lombok是一个java库,它可以自动插入您的编辑器和构建工具,为您的java提供帮助。再也不要写其他的getter或equals方法了。尽早访问诸如val之类的未来java特性。

  Tip:单人项目开发中使用极佳,或多人协作开发中强制要求使用相同环境。因为需要配置的原因,但目前编辑器和编译器还没有那么智能和友善o(╥﹏╥)o...

效果

  • 未使用Lombok前的POJO大概是这样的(为了方便,下面把Entity、DTO、VO之类的都统称为POJO)
public class User {

    private Integer id;

    private String nickname;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "User{" +
                "nickname='" + nickname + '\'' +
                ", id=" + id +
                '}';
    }

}
  • 使用了Lombok之后的POJO大概是这样的
@Data
public class User {

    private Integer id;

    private String nickname;

}

搭建

  1. 添加依赖
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
  1. 下载插件(IDEA)
  1. 配置支持

  PS:IDEA中的Spring Initializr已集成Lombok,新建Spring Boot项目的时候勾选Lombok选择即可

说明图

  下面先来看下Lombok中几个主要常用注解介绍说明图:

具体说明

  • @Data(常用)

  在类上使用此注解,相当于为当前类的非final字段添加了getter()、setter()、toString()、equals()以及hashCode()方法,同时这也是一个多功能组合注解,组合了下面的@ToString,@EqualsAndHashCode,@Getter,@Setter和@RequiredArgsConstructor这五个注解

  • @Builder(常用)

  此注解需用在类上。Lombok底层通过构造者模式来转换当前类,在项目实际使用的时候,我们可以以参数链的形式组装该对象,或者是以全参构造器的形式来new一个当前对象。当组合使用@Data注解的时候(一般来说是没必要的),Lombok也不会再为当前对象生成getter()、setter()方法。使用链式构造一个对象会显得更加优雅,所以这个注解也是非常实用的

  • @Builder.Default(常用)

  此注解用在字段上。当前类使用了@Builder进行构造且某些字段含有默认值的情况下,需要为这些字段添加此注解,不加此注解默认值在构造的时候是不生效的,需要进行手动设值

  • @Slf4j(常用)
    private final Logger logger = LoggerFactory.getLogger(getClass());

  上面这段代码很熟悉吧。为当前类添加@Slf4j后,我们就可以舍弃这段代码了,是不是简洁多了

  • val, var(常用)

  val将局部变量申明为final类型,而var则用于修饰变量但不是final类型

    val noLombok = new HashSet<String>();
    var noLombok2=new ArrayList<Integer>();
    
    ////=> 以上这段代码相当于:
    final Set<String> useLombok = new HashSet<>();
    List<Integer> useLombok2=new ArrayList<>();
  • @NonNull(常用)

  该注解能够为方法,或构造函数的参数提供非空检查

    public void notNull(@NonNull String arg) {
    }
    
    //=> 以上这段代码相当于:
    public static void notNull(String arg) {
        if (arg != null) {
        } else {
            throw new NullPointerException("arg");
        }
    }
  • @Cleanup(较常用)

  常用于资源释放

 public void CleanUp() {
        try {
            @Cleanup Jedis jedis = redisService.getJedis();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //=> 以上这段代码相当于:
        Jedis jedis = null;
        try {
            jedis = redisService.getJedis();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                try {
                    jedis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • @Synchronized(较常用)

  类似于 Synchronized 关键字,但是可以隐藏同步锁

public class SynchronizedExample {
 
    private final Object readLock = new Object ();
 
    @Synchronized
    public static void test1() {
        System.out.println("test1");
    }
 
    @Synchronized("readLock")
    public void test2() {
        System.out.println("test2");
    }

}

 //=> 以上这段代码相当于:
public class SynchronizedExample {
 
    private static final Object $LOCK = new Object[0];
    private final Object readLock = new Object ();
 
    @Synchronized
    public static void test1() {
        synchronized($LOCK) {
            System.out.println("test1");
        }
    }
 
    @Synchronized("readLock")
    public void test2() {
        synchronized(readLock) {
            System.out.println("test2");
        }
    }

}
 
  • @NoArgsConstructor, @RequiredArgsConstructor、@AllArgsConstructor (较常用)

  分别对应可生成无参构造器,指定参数的构造器和包含全部字段的构造器。第1个和第3个注解还是比较挺实用的,如果要生成部分参数的构造器,博主是比较建议手动生成,感觉注解还不太好用了。(注意:当类中有final字段没有被初始化时,编译器就会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null。而对于具有约束的字段(如@NonNull字段),则不会生成检查或分配,因此要注意正确初始化final修饰的字段,否则这些约束都是无效的

  • @Getter、@Setter、@ToString、@EqualsAndHashCode (不常用)

  这几个注解都很好理解,见其名知其意,只是要注意注解的使用位置。对于@Getter和@Setter,默认生成的方法是public的,如果要修改方法的修饰符,可以设置AccessLevel的值,如:@Getter(access = AccessLevel.PROTECTED)

  • @Value,@SneakyThrows ...(目测不常用)

  一些注解的具体用法还是参考Lombok官网吧

小结

  具体到实现原理方面,在下面的参考链接中也有相关的介绍,感兴趣的还请自行研究。结合最近的使用情况,觉得最舒服的就是临时加字段的情况下,也不需要我们再补上getter()、setter()和toString()。一般来说,我们只需要在POJO上用@Data 一个注解就基本满足了,还有@NoArgsConstructor,@AllArgsConstructor这两个注解有时候也经常用得上。

参考链接

lombok官网
lombok - 简书
lombok的使用和原理
Java开发神器Lombok的使用与原理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容