美文网首页程序员
优雅编程 - Lombok

优雅编程 - Lombok

作者: 林昀熙 | 来源:发表于2019-12-20 07:41 被阅读0次

    Lombok可以做到对已有Java代码在字节码层级的改变,它的目的在于让程序员少写一些“样板代码”;所谓样板代码是那些没有营养,却又不得不写的代码;像实体中定义的getter、setter、equals、hashcode、toString等方法).

    Intelli IDEA安装Lombok插件

    1.【Intelli IDEA】- 【Preferences】-【plugins】

    1. 搜索lombok,点击install.

    Lombok常用注解

    • @Getter/ @Setter:
      注解在属性上;为属性提供 getting 和 setting 方法

    • @ToString:
      实现toString()方法

    • @EqualsAndHashCode:
      实现equals()方法和hashCode()方法

    • @Data :
      注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法

    • @Log4j :
      注解在类上;为类提供一个 属性名为log 的 log4j 日志对象

    • @NoArgsConstructor:
      注解在类上;为类提供一个无参的构造方法

    • @AllArgsConstructor:
      注解在类上;为类提供一个全参的构造方法

    • @Builder:
      注解在类上:实现一种Builder Patterns(生成器模式)的功能

    • @SneakyThrows:
      注解到方法上:可以实现在try...catch到异常后进行的throw操作

    • @Synchronized:
      注解到方法上:实现同步代码片段的功能

    更多注解说明: 官方文档

    Lombok使用

    常用的模板代码注解化示例

    @Setter
    @Getter
    @ToString
    @EqualsAndHashCode
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    class BasicModel implements Serializable{
    
        private Long id;
        private String title;
        private Double score;
        private Date createTime;
    
        public static void main(String[] args) {
    
            Date now = new Date();
    
            // 通用模式构建对象
            BasicModel bm1 = new BasicModel();
            bm1.setCreateTime(now);
            bm1.setId(1L);
            bm1.setScore(11D);
            bm1.setTitle("Lombok示例1");
    
            // Builder模式构建对象
            BasicModel bm2 = BasicModel.builder()
                    .id(1L).score(11D).title("Lombok示例1").createTime(now)
                    .build();
    
            // 全参构造
            // 需要注意的是Lombok提供的全参构造是依赖属性在对象中定义顺序的,
            BasicModel bm3 = new BasicModel(2L, "Lombok示例1", 11D, now);
    
            // toString使用
            System.out.println("bm1 = " + bm1);
            System.out.println("bm2 = " + bm2);
            System.out.println("bm3 = " + bm3);
    
            // equals()使用
            System.out.println("bm1.equals(bm2) = " + bm1.equals(bm2));
            System.out.println("bm1.equals(bm3) = " + bm1.equals(bm3));
    
        }
    }
    

    示例执行结果

    bm1 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
    bm2 = BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
    bm3 = BasicModel(id=2, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:14:17 CST 2016)
    bm1.equals(bm2) = true
    bm1.equals(bm3) = false
    

    上面的注解可以简化为如下

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    class BasicModel implements Serializable{
    
        private Long id;
        private String title;
        private Double score;
        private Date createTime;
    }
    

    Lombok问题方案

    问题: 父子类集成关系中中全参构造, 以及Builder模式构建对象时,父类属性不可见。
    方案:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    class BasicModel implements Serializable{
    
        private Long id;
        private String title;
        private Double score;
        private Date createTime;
    }
    
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString(callSuper = true)
    class ArticleModel extends BasicModel{
    
        private String author;
        private String images;
    
        // 增减该构造方案, 此时子类中有三个构造,@NoArgsConstructor、@AllArgsConstructor、当前构造
        @Builder
        public ArticleModel(Long id, String title, Double score, Date createTime,
                            String author, String images) {
            super(id, title, score, createTime);
            this.author = author;
            this.images = images;
        }
    
        public static void main(String[] args) {
    
            Date now = new Date();
    
            // Builder模式构建对象
            ArticleModel am1 = ArticleModel.builder()
                    .id(1L).score(11D).title("Lombok示例1").createTime(now)
                    .author("Elon.su").images("图片地址")
                    .build();
    
            // 常见的模板对象创建
            ArticleModel am2 = new ArticleModel("Elon.su", "图片地址");
            am2.setId(1L);
            am2.setTitle("Lombok示例1");
            am2.setCreateTime(now);
    
            // toString使用
            System.out.println("am1 = " + am1);
            System.out.println("am2 = " + am2);
    
            // equals()使用
            System.out.println("am1.equals(am2) = " + am1.equals(am2));
        }
    }
    

    示例执行结果

    am1 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=11.0, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
    am2 = ArticleModel(super=BasicModel(id=1, title=Lombok示例1, score=null, createTime=Sun Nov 27 17:41:53 CST 2016), author=Elon.su, images=图片地址)
    am1.equals(am2) = true
    

    相关文章

      网友评论

        本文标题:优雅编程 - Lombok

        本文链接:https://www.haomeiwen.com/subject/yptvnctx.html