前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java类库:Lombok

Java类库:Lombok

作者头像
happyJared
发布2018-09-20 10:22:47
9040
发布2018-09-20 10:22:47
举报
文章被收录于专栏:happyJaredhappyJared

前言

  前阵子闲逛的时候,留意到了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)
代码语言:javascript
复制
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 +
                '}';
    }

}
simple entity
simple entity

simple entity

  • 使用了Lombok之后的POJO大概是这样的
代码语言:javascript
复制
@Data
public class User {

    private Integer id;

    private String nickname;

}
use lombok
use lombok

use lombok

搭建

  1. 添加依赖
代码语言:javascript
复制
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
  1. 下载插件(IDEA)
下载Lombok Plugin插件
下载Lombok Plugin插件

下载Lombok Plugin插件

  1. 配置支持
开启支持
开启支持

开启支持

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

Spring Initializr -> Lombok
Spring Initializr -> Lombok

Spring Initializr -> Lombok

说明图

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

Lombok常用注解说明图
Lombok常用注解说明图

Lombok常用注解说明图

具体说明

  • @Data(常用)

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

@Data
@Data

@Data

  • @Builder(常用)

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

@Builder
@Builder

@Builder

  • @Builder.Default(常用)

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

@Builder.Default
@Builder.Default

@Builder.Default

  • @Slf4j(常用)
代码语言:javascript
复制
    private final Logger logger = LoggerFactory.getLogger(getClass());

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

@Slf4j
@Slf4j

@Slf4j

  • val, var(常用)

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

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

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

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

  常用于资源释放

代码语言:javascript
复制
 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 关键字,但是可以隐藏同步锁

代码语言:javascript
复制
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的使用与原理

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.03.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Lombok
  • 效果
  • 搭建
  • 说明图
  • 具体说明
  • 小结
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档