zoukankan      html  css  js  c++  java
  • Project Lombok——带给你简洁、清晰的代码

    相信但凡有一点Java编程经历的人,都见过或者写过下面这种代码。这是一个简单的POJO,只有4个fields,加上构造器、equalshashtoString以及各种getter setter,前前后后加起来大约70多行代码。这还只是4个fields,如果有十个以上,那么代码行数轻轻松松过一百。如果老板或主顾们按代码行数给钱的话,Java程序员应该都发财了。

    public class Mountain {
        private String name;
        private double latitude, longitude;
        private String country;
        public Mountain(String name, double latitude, double longitude, String country) {
            //...巴拉巴拉
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Mountain mountain = (Mountain) o;
            return Double.compare(mountain.latitude, latitude) == 0 && 
                Double.compare(mountain.longitude, longitude) == 0 && 
                Objects.equals(name, mountain.name) && Objects.equals(country, mountain.country);
        }
        //各种getter setter toString hashCode...etc
    }
    

    有了代码自动生成,这种苦痛会稍微降低点,但是你的代码仍然会显得“脏乱”。Project Lombok,一个成熟的library,通过编译期插入的方式,大量减少样板代码,让你的代码显得干净、简洁、易读。相信很多人都用上了,没用的,建议赶紧上车。

    安装

    在Maven的pom文件中加入

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
        <scope>provided</scope>
    </dependency>
    

    即可安装成功。你也可以到官网下载jar包,通过IDE直接导入,但是不推荐。窃以为,连前端都少不了npm的年代,Maven和Gradle至少二选一。

    另外,譬如IntelliJ Idea这种IDE,需要在plugin market里搜索lombok,下载并安装相关插件,否则IDE会报错。

    使用注解简化代码

    这里主要介绍一些常用注解。

    剪除getter、setter样板代码

    @Setter @Getter @EqualsAndHashCode @ToString(exclude = {"country"}) 
    public class Mountain {
        private String name;
        private double latitude, longitude;
        private String country;
    }
    

    注解的名称几乎都是自解释的。

    @Setter@Getter可以生成全部非静态field的getter和setter方法,@EqualsAndHashCode可以生成标准的equals()hashCode()方法。@ToString,顾名思义,生成toString()方法,其中exclude属性用于排除不想出现在返回值中的field。

    从图中也可以看出,各种getter equals等方法,已经在编译期生成了。

    另外@Setter@Getter也可以注解到filed上,对于某些field,我们只想提供getter方法,直接注解field的方式更加灵活。

    空值检查——@NonNull

    @Setter @Getter @NonNull
    public class Mountain {
        private String name;
        private double latitude, longitude;
        private String country;
    }
    

    通过@NonNull注解,可以自动检查setter方法的入参是否非空,当传入null值时,则抛出空指针异常。它等同于以下实现,

    public id setName(@NonNull final String name){
        if(name == null) throw 
            new java.lang.NullPointerException("name");
        this.name = name;
    }
    

    生成构造器

    @NoArgsConstructor @AllArgsConstructor
    public class Mountain {
        private String name;
        private double latitude, longitude;
        private String country;
    }
    

    使用@NoArgsConstructor可以生成空参构造器,就像编译器平日为我们做的一样。@AllArgsConstructor可以生成包含全部非静态field的构造器。

    融合多个注解——@Data

    以上一个一个注解的添加上去,仍然非常的繁琐,有没有一键搞定的注解?

    @Data @AllArgsConstructor
    public class Mountain {
        private String name;
        private double latitude, longitude;
        private String country;
    }
    

    @Data,相当于@ToString+ @EqualsAndHashCode+@Getter+@Setter+@RequiredArgsConstructor。配合@AllArgsConstructor几乎能覆盖日常大部分需求。

    另外,@Data还有一个亲兄弟——@value,功能几乎等同于@Data+@AllArgsConstructor,不同的是,它生成的是不可变类(Immutable class)。在class关键字前会自动加上final修饰符,且不再提供各个fieldsetter参数。

    生成构造器——@Build

    @Builder
    public class Mountain {
        private String name;
        private double latitude, longitude;
        private String country;
    

    @Build注解可以提供给当前对象一个构造器。不知道有咩有童鞋有过这样的经历,为了提供不同field组合的初始化构造器,结果必须写一大堆构造器重载方法。如果有10+的filed的话,仅仅构造器就有100行代码。对于这种情况,《Effetive Java》的作者建议,我们应该提供一个构造器,而不是重载一堆让人眼花缭乱的构造器。现在,我们仅仅添加一个@Build,就可以做到大神提供的最佳实践。

    其调用起来也非常简单:

    Mountain.builder()
        .name("tai")
        .country("china").latitude(22.456).build();
    

    这样看起来是不是更加的舒服、简洁呢!

    结语以及其他

    另外还有@Cleanup注解,它相当于try-with-resource的另一个版本,避免手动调用各种丑陋的close()方法。在Java7之前这是很好用的,现在也可以作为你的备选项。

    @Synchronized,用于标注静态方法,相当于原生的syncronize关键字。

    @Log4j2配合apache的log4j2库使用,注解在class级别上

    @Log4j
    public class TestModel {
        public void  hello(){
            log.info("log....");
        }
    }
    

    以上都是一些常用的注解,他们可以消除我们日常大部分的POJO样板代码,使代码保持简洁、易读,更多特性和注解可以参考官方文档

  • 相关阅读:
    ios实例开发精品源码文章推荐
    Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面
    TOJ3651确定比赛名次
    TOJ3649欧拉回路
    强连通分量(LRJ训练指南)
    汉语-词语-体谅:百科
    汉语-词语-关心:百科
    汉语-词语-懒惰:百科
    汉语-词语-平静:百科
    汉语-词语-遗迹:百科
  • 原文地址:https://www.cnblogs.com/Franken-Fran/p/lombok_intro.html
Copyright © 2011-2022 走看看