专栏首页mall学习教程Lombok,嗯,真香香香香香香!

Lombok,嗯,真香香香香香香!

Lombok到底是什么?

先看一下它的官网

英语懒得看?没关系。

它大致意思是:Lombok是一个很牛批的插件(本质是个Java库),项目里一旦引入了Lombok神器之后,你项目中所有诸如:对象的构造函数、 equals()方法,属性的 get()/set()方法等等,这些没有技术含量的代码统统都不用写了,Lombok帮你搞定一切,全部帮你自动生成!

听起来好像是挺不错...

眼见为虚,代码为实,本文亲自尝试一下!


项目中引入Lombok

首先在项目的 pom.xml中引入 Lombok依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

除此之外,还要在IDE中安装Lombok插件,并配置:

接下来进行代码实验。


爽!get/set不用写了

以前我们写一个 POJO对象时,比如定义一个课程 Course,需要自己手动写上每个字段的 get()set()方法,就像这样:

public class Course {

    private Long id;        // 课程ID

    private String name;    // 课程名称

    private Integer score;  // 课程成绩

    // 自己手写下面的 get/set 方法!
    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }
}

但是借助于Lombok,一切都变得优雅起来,代码篇幅省了一半

public class Course {

    @Getter
    @Setter
    private Long id;        // 课程ID

    @Getter
    @Setter
    private String name;    // 课程名称

    @Getter
    @Setter
    private Integer score;  // 课程成绩
}

两个注解:@Getter@Setter即可方便搞定。


爽!new对象变得优雅了

在没有用Lombok之前,我们假如想new一个对象,我们往往会这么做(以上面的 Course类为例):

Course course = new Course();  // 首先new一个对象

// 然后逐步去装填对象的各个字段
course.setId( 123l );     
course.setName( "高等数学" );
course.setScore( 100 );

引进Lombok之后,我们只需要在 Course类上用上 @Builder注解:

@Builder
public class Course {
    private Long id;        // 课程ID
    private String name;    // 课程名称
    private Integer score;  // 课程成绩
}

Course类对象的创建即可使用 链式表达 的方式一行代码完成:

// 对象可以链式构造,一句话完成 !
Course course = Course.builder().id(123l).name("高等数学").score(100).build();

看到这里,如果你学过设计模式中的 “建造者模式” 的话,一定能猜到 @Builder注解就是一个典型的“建造者模式”的实现案例!

建造者模式的链式调用用起来实在是很爽!


爽!构造函数不用写了

一、全参构造器不用写了

当你在你的类上使用了Lombok的注解 AllArgsConstructor时:

@AllArgsConstructor
public class Course {

    private Long id;        // 课程ID

    private String name;    // 课程名称

    private Integer score;  // 课程成绩
}

这时候你的类在编译后会自动生成一个无参构造函数,就像这样:

public class Course {

    private Long id;        // 课程ID

    private String name;    // 课程名称

    private Integer score;  // 课程成绩

    // Lombok自动会帮你生成一个全参构造器!!
    public Course( Long id, String name, Integer score ) {
        this.id = id;
        this.name = name;
        this.score = score;
    }
}

二、无参数构造器也不用写了

当你在你的类上使用了Lombok的注解 NoArgsConstructor时:

@NoArgsConstructor
public class Course {

    private Long id;        // 课程ID

    private String name;    // 课程名称

    private Integer score;  // 课程成绩
}

这时候你的类在编译后会自动生成一个无参构造函数,就像这样:

public class Course {

    private Long id;        // 课程ID

    private String name;    // 课程名称

    private Integer score;  // 课程成绩

    // Lombok自动会帮你生成一个无参构造器!!
    public Course() {
    }

}

三、部分参数构造器也不用写了

当你在你的类上使用了Lombok的注解 RequiredArgsConstructor时:

@RequiredArgsConstructor
public class Course {

    private Long id;        // 课程ID

    private final String name;    // 课程名称

    private Integer score;  // 课程成绩

}

这时候你的类在编译后会自动生成一个具备部分参数的构造函数,就像这样:

public class Course {

    private Long id;        // 课程ID

    private final String name;    // 课程名称

    private Integer score;  // 课程成绩

    // 因为name字段定义成final,所以Lombok自动会帮你生成一个部分参数的构造器!!
    public Course(String name) {
        this.name = name;
    }
}

因为 name字段定义成 final,所以 Lombok自动会帮你生成一个部分参数的构造器!!


爽!null判空不用写了

Lombok的 @NonNull注解可以自动帮我们避免空指针判断。该注解作用在方法参数上,用于自动生成空值参数检查,比如:

public static void output( String input ) {
    // 作为一个严谨且良心的Java开发工程师
    // 一般我们要手动对入参进行校验,就像下面这样 !
    if( input == null ) {
        System.out.println("该函数输入参数为空");
    }
    System.out.println( input );
}

但是有了Lombok之后,事情就变得简单了,一个注解搞定:

public static void output( @NonNull String input ) {
    // 原先这里对 input 的判空不用手动做了
    System.out.println( input );
}

爽!屁股不用擦了

什么意思呢?

假如我们要读取一个 txt文本文件,一般会这样写代码:

BufferedReader br = null;
try {
    FileReader fileReader = new FileReader("呵呵.tet"); // 定义文件
    br = new BufferedReader( fileReader ); // 读取文件
    System.out.println( br.readLine() ); // 读取文件一行内容
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        br.close(); // 无论如何文件句柄在使用结束后得手动关闭!!
    } catch (IOException e) {
        e.printStackTrace();
    }
}

注意,这个文件句柄在使用完成之后是一定要手动 close的,否则就有可能资源泄漏

有了Lombok之后,这种擦屁股活儿统统不用干了,一个 @Cleanup注解即可搞定

@Cleanup BufferedReader br = null;  // 一个 @Cleanup注解搞定!
try {
    FileReader fileReader = new FileReader("呵呵.tet");
    br = new BufferedReader( fileReader );
    System.out.println( br.readLine() );
} catch (Exception e) {
    e.printStackTrace();
}

爽!异常不用捕捉了

比如我们打开一个 txt文本文件:

public void openTxt( String filename ) {
    try {
        FileReader fileReader = new FileReader( filename );
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

这地方的 FileNotFoundException异常,要么显式地在函数级抛出,要么就像上面一样 try/catch内部消灭。

如果在编码时,不想处理这种繁杂的异常处理,你可以使用Lombok的 @SneakyThrows注解进行简化,比如上面的代码就可以简化为:

@SneakyThrows
public void openTxt( String filename ) {
    FileReader fileReader = new FileReader( filename );
}

这样你编码时就无需处理异常了。

必须友情提示的是:这样写你是爽了,但你很有可能会被队友一顿暴打,因为别人调用你编写的函数,并不能显式的获知需要处理哪些异常,这样容易留坑!


还有很多 ...

好了,受限于篇幅限制,抛砖引玉就到这里了。

上面列举了几个平时项目开发中使用非常频繁的Lombok注解,除此之外,还有诸如像:

  • @ToString:为类自动生成toString()方法
  • @EqualsAndHashCode:为类自动生成hashCode和equals实现
  • @Log:为类自动生成log日志记录
  • @Synchronized:为类方法或实例方法自动生成synchronized保护

等工具也是非常好用的,大家可以尝试在项目里用起来。

从此,代码5分钟,划水2小时不是梦。。。

每天进步一点点!Peace!

本文分享自微信公众号 - macrozheng(gh_433697c99b25)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!

    首先我们需要创建一个过滤器,用于实现动态权限控制,这里需要注意的是doFilter方法,对于OPTIONS请求直接放行,否则前端调用会出现跨域问题。对于配置在I...

    macrozheng
  • 订单模块数据库表解析(一)

    macrozheng
  • SpringBoot中处理校验逻辑的两种方式,真的很机智!

    这种方式的优点是可以使用注解来实现参数校验,不需要一些重复的校验逻辑,但是也有一些缺点,比如需要在Controller的方法中额外注入一个BindingResu...

    macrozheng
  • 常用设计模式——迭代器模式

    用户5325874
  • Black Hat 2018 | 人工智能与机器学习成焦点话题

    美国当地时间8月8日,一年一度的Black Hat(黑帽子)大会在拉斯维加斯如期举行。不经意间,这项吸引全球顶级厂商、黑客的大会已走过了21个年头。21年前,当...

    安恒信息
  • 图解Java设计模式之享元模式

    小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网 站,但是要求都有些不同:

    海仔
  • java之struts2之数据检验

    1.使用struts2时,有时候需要对数据进行相关的验证。如果对数据的要求比较严格,或对安全性要求比较高时,前端 js 验证还不够,

    Vincent-yuan
  • JavaWeb入门之Servlet小练习

    在web.xml文件中设置两个WEB应用的初始化参数,username,password,创建一个html页面,定义两个请求字段并发送到一个Servlet中,对...

    黄桂期
  • python 3 if else 流程判

    py3study
  • 小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)

    泰斗贤若如

扫码关注云+社区

领取腾讯云代金券