• JAVA 链式编程和建造者模式的使用(lombok的使用)


    0.说明

    0.1 链式编程

    链式编程的原理是返回一个this对象,也就是返回对象本身,从而达到链式效果。这样可以减少一些代码量,是java8新增的内容。
    此处主要介绍在新建对象使用链式编程更加方便的创建对象。链式编程的一些常见用法可以看这个:帖子

    0.2 建造者模式

    建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
    建造者模式是设计模式的一种思想。

    0.3 Lombok 简介

    Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。
    以下是常见的一些注解:

    • @Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
    • @Getter 使用方法同上,区别在于生成的是getter方法。
    • @ToString 注解在类,添加toString方法。
    • @EqualsAndHashCode 注解在类,生成hashCode和equals方法。
    • @NoArgsConstructor 注解在类,生成无参的构造方法。
    • @RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
    • @AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
    • @Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
    • @Slf4j 注解在类,生成log变量,严格意义来说是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);

    以及本次要使用的

    • @Accessors(chain = true) 默认chain=false,是否开启链式编程
    • @Builder 使用构造模式

    0.4 说明

    以学生类为例,以下面几种方式分别实现输出一个对象。

    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        private boolean sex;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1. 普通模式

    每一个单独写getter,setter方法,toString方法。

    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        private boolean sex;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public boolean isSex() {
            return sex;
        }
    
        public void setSex(boolean sex) {
            this.sex = sex;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    ", sex=" + sex +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    创建实例时,使用new方法来创建实例,如下

    public static void main(String[] args) {
            Student student = new Student();
            student.setId(20231024);
            student.setAge(10);
            student.setName("duck");
            student.setSex(false);
            System.out.println(student);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行结果如下图:
    在这里插入图片描述

    2.使用lombok简化

    导包lombok

    		<dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>1.18.22version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    添加@Data注解,@Data注解可以帮我们生成get,set,toString方法

    import lombok.Data;
    
    @Data
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        private boolean sex;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    3.链式方法

    3.1 不使用lombok

    首先是类,所有的set方法均使用返回本身,返回this指针。

    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        private boolean sex;
    
        public Integer getId() {
            return id;
        }
    
        public Student setId(Integer id) {
            this.id = id;
            return this;
        }
    
        public String getName() {
            return name;
        }
    
        public Student setName(String name) {
            this.name = name;
            return this;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public Student setAge(Integer age) {
            this.age = age;
            return this;
        }
    
        public boolean isSex() {
            return sex;
        }
    
        public Student setSex(boolean sex) {
            this.sex = sex;
            return this;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    ", sex=" + sex +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    在此处即可使用链式方法给每一个属性赋值,更加方便。

    public class main {
        public static void main(String[] args) {
            Student student = new Student();
    //        student.setId(20231024);
    //        student.setAge(10);
    //        student.setName("duck");
    //        student.setSex(false);
            student.setId(20231024).setAge(20).setName("duck").setSex(true);
            System.out.println(student);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果如下:
    在这里插入图片描述

    3.2 使用lombok

    支持链式编程的注解为:@Accessors(chain = true),默认chain=false
    代码如下:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.experimental.Accessors;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Accessors(chain = true)
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        private boolean sex;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在target文件夹里,我们可以找到生成的class文件,如下图,可以看到我们的注解被编译为上诉不使用注解相同的代码。
    在这里插入图片描述
    测试结果如下,依然相同

    public class main {
        public static void main(String[] args) {
            Student student = new Student();
    //        student.setId(20231024);
    //        student.setAge(10);
    //        student.setName("duck");
    //        student.setSex(false);
            student.setId(20231024).setAge(20).setName("duck").setSex(true);
            System.out.println(student);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    4.建造者模式

    使用@Builder注解,@Builder注解也属于lombok

    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.experimental.Accessors;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Accessors(chain = true)
    @Builder
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        private boolean sex;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    使用的代码如下,不需要new一个对象,可以直接类.builder().属性1.属性2…属性n.build();如下所示

    public class main {
        public static void main(String[] args) {
    //        Student student = new Student();
    //        student.setId(20231024).setAge(20).setName("duck").setSex(true);
            Student student = Student.builder().id(20231024).age(25).name("duck").sex(false).build();
            System.out.println(student);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果如下:
    在这里插入图片描述

  • 相关阅读:
    [附源码]计算机毕业设计网文论坛管理系统Springboot程序
    java计算机毕业设计江智能股票推荐系统MyBatis+系统+LW文档+源码+调试部署
    机器人制作开源方案 | 莲花灯
    Android框架mqtt库无法兼容高版本android13的问题
    郑州团购分销小程序开发如何运营?
    数据挖掘:关联规则,异常检测,挖掘的标准流程,评估指标,误差,聚类,决策树
    Windows取证——登录过的用户名、新建的用户名和访问的网址文件(墨者学院)
    【JVM】native关键字的使用
    Vue框架学习笔记——Vue框架的安装
    Linux学习-Linux系统及编程基础笔记
  • 原文地址:https://blog.csdn.net/qq_43471945/article/details/134014530