首页 > 其他分享 >构造器模式的具体作用和setter的区别

构造器模式的具体作用和setter的区别

时间:2023-10-25 12:11:51浏览次数:28  
标签:初始化 name 区别 age 构造 build Foo setter

1.构造器模式其实没有什么神秘性,它最终实现的功能和通过先new对象,然后一行一行调用该对象的setter来设置(注意,不是初始化)该对象的属性,最终形成的对象没有区别;

2.那构造器的作用是什么呢?作用如下:

2.1和用setter初始化对象属性最大的区别在于 构造器是要求先给出 该类型所有要初始化字段的 值,通过链式调用设置,全部初始化字段值 给出后,再调用build方法初始化该对象并返回;

所以这里的区别有点像C#里的流,前面设置一堆流处理逻辑,只有最后一步是产生List对象;

即先给出类型所有要初始化字段的所有字段值,然后以这些值来初始化创建该对象(注意,不是先创建,然后set,而是初始化时给定这些初始值);

即没有build之前的字段设置是在对象创建之前的,而setter是值对象创建之后的;

2.2第二个就是可以链式调用初始化;

 

2.3构造器模式不会暴露类的setter方法,构造器的设置值的方法只在类对象初始化的时候用到,build创建好对象后builder的设置值的方法就没有用了;

所以可以实现类Foo的三个字段都是没有setter的,但是又希望能可选择的初始化(比如只初始化两个字段),如果没有构造器则必须实现很多个构造方法;

因此Foo的构造器一般是在Foo类里面,这样可以在Foo没有暴露setter方法的前提下给Foo字段设值:

class Foo {
    private Integer age;
    private String name;
    private String num;
    
    // 这三个字段只有getter,没有setter,getter代码就不写了知道有就行
    
    public static FooBuilder builder() {
        return new FooBuilder();
    }
    
    public class static FooBuilder {
        private Integer age;
        private String name;
        private String num;
        
        FooBuilder age(Integer age) {
            this.age = age;
            return this;
        }
        
        FooBuilder name(Strng name) {
            this.name = name;
            return this;
        }
        
        FooBuilder num(String num) {
            this.num = num;
            return this;
        }
        
        Foo build() {
            Foo foo = new Foo();
            // TODO 这里还可以判断this.age是否为空或者默认值,如果是空则不对foo.age设值(看具体Builder策略来实现)
            foo.age = this.age;
            foo.name = this.name;
            foo.num = this.num;
            return foo;
        }
    }
}

通过上面的构造器实现,则可以保留Foo不对外提供setter的权限控制,但是在初始化时又能链式的对所有Foo字段的可选择的初始化,且FooBuilder对象在build后再进行age(..)等设值不会影响已经build出的Foo对象(即Foo对象初始化后就不提供

对外setter;如果用构造方法实现就要很多个构造方法)

而且Builder还能通过多个Builder接口来实现,必须先填name,再填password,即builder()方法返回NameStep接口,而此接口的name(..)方法返回PasswordStep接口,而password(..)则返回BuildStep普通接口(build方法);

然后FooBuilder要实现这三个接口;

还能在build里对整体做合法性校验

标签:初始化,name,区别,age,构造,build,Foo,setter
From: https://www.cnblogs.com/silentdoer/p/17684979.html

相关文章

  • \bar 和 \overline 的区别
    0前言笔者在做最优化作业的时候犯了一个小小的错误,就是使用了不标准的上划线,请听我娓娓道来......
  • C++前缀和算法:构造乘积矩阵
    题目给你一个下标从0开始、大小为n*m的二维整数矩阵grid,定义一个下标从0开始、大小为n*m的的二维矩阵p。如果满足以下条件,则称p为grid的乘积矩阵:对于每个元素p[i][j],它的值等于除了grid[i][j]外所有元素的乘积。乘积对12345取余数。返回grid的乘积......
  • 过滤器和拦截器区别
    过滤器和拦截器区别InteceptorFilter所属包在spring包在javax包属于哪个容器属于web容器属于spring容器资源的使用不能获取spring的资源可以获取spring的资源过滤先后后前使用场景和业务相关如日志处理统计业务无关的公共代码例如设置......
  • @Controller和@RestController的区别
    总体上,@Controller和@RestController都是SpringMVC框架中的注解,用于标识一个类是SpringMVCcontroller处理器,可以接收HTTP请求。但它们在处理请求和返回结果方面存在一些不同。返回类型:@Controller:如果使用@Controller注解,那么类中的方法可以直接通过返回String跳转到jsp、......
  • 好好回答下 TCP 和 UDP 的区别!
    写了这么多篇关于TCP和UDP的文章,还没有好好聊过这两个协议的区别,这篇文章我们就来开诚布公的谈一谈。关于TCP和UDP,想必大家都看过一张这样的图。有一个小姑娘在对着瓶口慢慢的喝水,下面写着可靠的传输,少女的衣服没有被水浸湿,这张图被称为TCP。然后又有一个小姑娘在举着水......
  • 深入解析i++和++i的区别及性能影响
    在我们编写代码时,经常需要对变量进行自增操作。这种情况下,我们通常会用到两种常见的操作符:i++和++i。最近在阅读博客时,我偶然看到了有关i++和++i性能的讨论。之前我一直在使用它们,但从未从性能的角度考虑过,这让我突然产生了兴趣。尽管它们看起来相似,但它们之间存在微妙而重要的区别......
  • y电容和高压瓷片电容区别对比
    多外观上来看,Y电容和高压瓷片电容非常像,有人甚至这样认为,所谓的Y电容,也就是多了个认证的瓷片电容,事实上真的是这样的吗?Y电容和瓷片电容有区别吗?到底有哪些区别?今天KYET小编就来为大家详细讲解一下。Y电容确实也属于高压瓷片电容:y电容也就是常见的安规电容器的一种,也可以叫做安......
  • 频谱仪的内部衰减和外接衰减器有何区别?对底噪和测试结果有什么影响?
    内部衰减器是指Amplitude菜单的Attenuation,貌似这个值越大频谱仪的底噪越大,那外接衰减器呢?频谱分析仪显示的信号是叠加在平均噪声电平上,这个噪声是由频谱仪自身产生的,大部分来自中频放大器的第一级,它是宽带白噪声,经过中频滤波器后送到包络检波器的平均噪声功率,当输入衰减增加时,降......
  • strcpy、strncpy、memcpy 区别与实现
    strcpy、strncpy、memcpy的区别strcpy描述将一个字符串复制到另一个字符串中实现char*myStrcpy(char*dest,constchar*src){if((NULL==dest)||(NULL==src)){returnNULL;}char*strDest=dest;constchar*strSrc=src;......
  • SWD与JTAG区别及使用情况 最新更新时间
      上图是SEGGER说明书中给出的Jlink引脚图,可以对照着看SWD引脚与JTAG引脚的关系。 这是我手边开发板上的JTAG连接图,这个肯定是能用的。  这个是从网上找来的标准的JTAG连接图,供对照参考。  调试方式既可以用JTAG,也可以用SWD。 以下是一段转自:(http://showvi.c......