【JAVA】如何突出一个有很多属性的对象的重点属性?

373 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

传统写法

首先,我们有一个Param对象,他有9个参数,当我们new出它的时候通常会有两种写法:

public class BuilderTest {
    public static void main(String[] args) {
        //写法一
        Param param = new Param("1", "2", "3", "4", "5", "6", "7", "8", "9");
        //写法二
        Param param1 = new Param();
        param1.setParam1("1");
        param1.setParam2("2");
        param1.setParam3("3");
        param1.setParam4("4");
        param1.setParam5("5");
        param1.setParam6("6");
        param1.setParam7("7");
        param1.setParam8("8");
        param1.setParam9("9");
    }
}

class Param {

    private String param1;
    private String param2;
    private String param3;
    private String param4;
    private String param5;
    private String param6;
    private String param7;
    private String param8;
    private String param9;

    public Param() {
    }

    public Param(String param1, String param2, String param3, String param4,
                 String param5, String param6, String param7, String param8,
                 String param9) {
        this.param1 = param1;
        this.param2 = param2;
        this.param3 = param3;
        this.param4 = param4;
        this.param5 = param5;
        this.param6 = param6;
        this.param7 = param7;
        this.param8 = param8;
        this.param9 = param9;
    }
	......//这里是get和set方法
}

你写代码的时候是不是觉得这样写很舒服,甚至都不用动脑子,那是因为你明确了解每个参数的意义,如果换个人来看,首先构造方法就9个参数,就已经劝退一拨人了,同时也不明确,哪几个参数是最重要的,必须要给的,这就很让人无语。

优化写法

使用Builder的模式是不是感觉清晰了很多,下面这种格式就明确的可以看出,param1和param2是必须要的参数,其余参数可选择的设置。

public class BuilderTest {
    public static void main(String[] args) {
        Param param =
                new Param.ParamBuilder("1", "2")
                        .param3("3")
                        .param4("4")
                        .build();
        
        System.out.println(param.getParam1());
    }
}

class Param {

    private String param1;
    private String param2;
    private String param3;
    private String param4;
    private String param5;
    private String param6;
    private String param7;
    private String param8;
    private String param9;

    /**
     * 注意这里,构造器私有化
     */
    private Param(ParamBuilder paramBuilder) {
        this.param1 = paramBuilder.param1;
        this.param2 = paramBuilder.param2;
        this.param3 = paramBuilder.param3;
        this.param4 = paramBuilder.param4;
        this.param5 = paramBuilder.param5;
        this.param6 = paramBuilder.param6;
        this.param7 = paramBuilder.param7;
        this.param8 = paramBuilder.param8;
        this.param9 = paramBuilder.param9;
    }

    /**
     * 一个静态Builder类
     */
    public static class ParamBuilder {
        private String param1;
        private String param2;
        private String param3;
        private String param4;
        private String param5;
        private String param6;
        private String param7;
        private String param8;
        private String param9;

        /**
         * 将必须要的参数放入构造函数
         */
        public ParamBuilder(String param1, String param2) {
            this.param1 = param1;
            this.param2 = param2;
        }

        public ParamBuilder param3(String param3) {
            this.param3 = param3;
            return this;
        }

        public ParamBuilder param4(String param4) {
            this.param4 = param4;
            return this;
        }

        public ParamBuilder param5(String param5) {
            this.param5 = param5;
            return this;
        }

        public ParamBuilder param6(String param6) {
            this.param6 = param6;
            return this;
        }

        public ParamBuilder param7(String param7) {
            this.param7 = param7;
            return this;
        }

        public ParamBuilder param8(String param8) {
            this.param8 = param8;
            return this;
        }

        public ParamBuilder param9(String param9) {
            this.param9 = param9;
            return this;
        }

        public Param build() {
            return new Param(this);
        }

    }

    public String getParam1() {
        return param1;
    }

    public String getParam2() {
        return param2;
    }

    public String getParam3() {
        return param3;
    }

    public String getParam4() {
        return param4;
    }

    public String getParam5() {
        return param5;
    }

    public String getParam6() {
        return param6;
    }

    public String getParam7() {
        return param7;
    }

    public String getParam8() {
        return param8;
    }

    public String getParam9() {
        return param9;
    }

    @Override
    public String toString() {
        return "Param{" +
                "param1='" + param1 + '\'' +
                ", param2='" + param2 + '\'' +
                ", param3='" + param3 + '\'' +
                ", param4='" + param4 + '\'' +
                ", param5='" + param5 + '\'' +
                ", param6='" + param6 + '\'' +
                ", param7='" + param7 + '\'' +
                ", param8='" + param8 + '\'' +
                ", param9='" + param9 + '\'' +
                '}';
    }
}

是不是有的童鞋发现 好像在哪见过这种写代码的方式?

没错,spring相关的东西里面随处可见。

下面就是我从Spring Security里面找的一个,相信不少人都用过吧。 在这里插入图片描述

Lombok写法

当然平时写代码不可能这么瓜皮,手撸是不存在的,lombok这玩意改用还是得用上,看:

public class BuilderTest2 {
    public static void main(String[] args) {
        Param2 build = new Param2.Param2Builder()
                .param1("1")
                .param2("2").build();
        System.out.println(build.getParam1());
    }
}

@Data
@Builder
class Param2{
    private String param1;
    private String param2;
    private String param3;
    private String param4;
    private String param5;
    private String param6;
    private String param7;
    private String param8;
    private String param9;
}

ps:虽然方便,但是突出重要参数的功能就没了,看心情选呗=。=