zoukankan      html  css  js  c++  java
  • 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小时不是梦。。。

     
    原文引自 : https://blog.csdn.net/zhenghongcs/article/details/104322675

  • 相关阅读:
    virtualbox+vagrant学习-2(command cli)-19-vagrant box命令
    virtualbox+vagrant学习-2(command cli)-24-Aliases别名
    virtualbox+vagrant学习-2(command cli)-23-vagrant version命令
    virtualbox+vagrant学习-2(command cli)-22-vagrant validate命令
    如何快速学习一门技术或进入一个岗位
    EL表达式详解
    关于JSP乱码问题
    java mail使用qq邮箱发邮件的配置方法
    数据库命名规范
    java中的Serializable接口的作用
  • 原文地址:https://www.cnblogs.com/Anonymity-zhang/p/12737579.html
Copyright © 2011-2022 走看看