当创建对象需要传入多个参数的时候我们通常会根据参数的数量写不同的构造器,具体如下
public A(int a){}
public A(int a, int b){}
public A(int a, int b, int c){}
根据不同的参数调用不同的构造器,但是当参数多了的时候,这种方式不够灵活,所以会实现动态传参的方法
public A(){}
public void seta(int a){}
public void setb(int b){}
public void setc(int c){}
这种方式提高了传参的可读性,也提高了传参的灵活性,但是会增加代码行数,同时在多线程异步执行的时候导致奇怪的错误。
有没有办法解决呢?既能提高代码可读性,提高参数灵活性,又不会增加代码行数,并保证线程安全呢?
构建器模式登场,先看代码:
public class A {
private int a;
private int b;
private int c;
public static class Builder {
private int a;
private int b;
private int c;
public Builder(){}
public Builder seta(int a) { this.a = a; return this}
public Builder setb(int b) { this.b = b; return this}
public Builder setc(int c) { this.c = c; return this}
public A build() { return new A(this)}
}
private A(Builder builder) {
this.a = builder.a;
this.b = builder.b;
this.c = builder.c;
}
}
调用构造方法:
A a = new A.Builder().seta(1).setb(2).setc(3).build();
这样就解决了以上所说的问题,但是他的缺点同样也是存在的,就是:
1.构造器写起来很复杂
2.创建对象开销比较大
所以构建器模式只适用于需要传入很多种情况参数的时候,比如大于4种参数的配合,才比较划算。
而且值得注意的是:最好在类的设计之初就考虑是否使用构建器,否则日后扩展起来新构建器旧构造器一起用维护起来不方便。
分享到:
相关推荐
2 章 创建和销毁对象(创建和气氛对象)第二章简介(章节介绍)第 1 条考虑静态工厂方法而不是构造函数(考虑以静态工厂方法代替构造函数)Item 2: 当面对许多构造函数参数时考虑构建器(在面对多个构造函数参数时,...
在构建词法分析器时,我们需要考虑以下关键概念和步骤: 1. **词法规则**:定义每个标记的模式,例如,关键字“if”,数字模式,标识符等。 2. **状态转换**:通过DFA,根据当前读取的字符决定词法分析器应进入的下...
第2章着重讲解了构造器模式,这是一种创建型设计模式,它关注的是对象的初始化过程。下面将详细阐述构造器模式的相关知识点,并结合提供的文件名来推测可能的学习内容。 首先,让我们理解构造器模式的基本概念。在...
**遇到多个构造器参数时的考虑**: - **重叠构造器模式**:这种模式下,每个构造器提供比前一个多一个参数,但是这种模式会导致构造器过多,增加复杂度。 - **JavaBeans模式**:虽然使用无参构造器并结合setter方法...
解释器的构造涉及到多个关键步骤,包括词法分析、语法分析、语义分析和代码生成。下面我们将详细探讨这些步骤以及它们在实验中的重要性。 1. **词法分析**:这是解释器的第一步,它将源代码分解成一系列称为“标记...
在ThinkPHP5框架中,查询构造器是一种强大的工具,它基于PDO实现,旨在简化数据库操作,提供统一的语法,无论你使用的是MySQL、Oracle还是SQL Server等不同的数据库系统。查询构造器的主要优点在于其语法的一致性和...
词法分析器的构造是编译器设计与实现的重要组成部分,涉及到了状态转移、正则表达式等多个概念。 1. **词法分析器的作用** 词法分析器的作用是将源代码中的字符流转化为符号流,这个过程包括识别关键字、标识符、...
在编程领域,编译原理是理解计算机语言转换...此外,了解词法分析器的构造也有助于将来在阅读和理解编译器源代码时更加得心应手,对于想要深入研究编译技术或者从事相关开发工作的人来说,这是一个非常宝贵的实践机会。
2. **非终端元素**(Non-Terminal Elements):这些是更复杂的语言构造,由一个或多个其他元素组成。它们代表了语言的语法结构,如表达式或控制结构。 3. **表达式类**(Expression Class):这是所有元素的基类,...
在构建语法分析器时,我们需要使用LL(1)方法来生成分析表。 LL(1)文法是一种特定的上下文无关文法,它具有两个性质:左递归和左因子。左递归是指在产生式中,左部和右部的开头符号相同,而左因子是指左部和右部...
在这个过程中,编译器分为多个阶段,主要包括词法分析、语法分析、语义分析和代码生成。 词法分析是编译程序的第一个阶段,它的任务是将源代码分解成一个个称为“token”的基本单元,这些token可以是关键字、标识符...
每个单元格中包含一个或多个产生式,表示当前非终结符遇到特定输入符号时应执行的动作。如果一个非终结符在某个输入符号下有且只有一个产生式,那么这个分析器就是LL(1),"1"表示只看一个输入符号就能决定下一步行动...
在 Laravel 中,开发者可以利用其丰富的工具和库来提高开发效率,而 "Former" 正是这样一个专为 Laravel 设计的表单构造器。 Former 是一款强大的第三方库,它的主要目标是帮助 Laravel 开发者快速、方便地创建和...
2. **构建器(Builder pattern)**:当类有多个构造器参数时,构建器模式提供了一种更清晰的构造对象的方式,避免了“参数过多”的问题。 3. **单例模式**:通过私有构造器和枚举类型强化单例属性,确保线程安全且...
#### 第二十四章:使用差分相位检测器输出的主动环路滤波器 - **内容介绍:**介绍了如何利用差分相位检测器的输出来设计主动环路滤波器。 - **核心知识点:** - 输出处理:如何处理差分相位检测器的输出信号。 - ...
或者,我们可以预先定义好层的列表,然后一次性传递给Sequential构造器: ```python layers = [Dense(2)] model = Sequential(layers) ``` 对于输入层,我们需要指定输入维度,这可以通过`input_dim`属性完成。...
第二版的《Java面向对象程序设计》课件旨在深入浅出地介绍这一关键概念,帮助学习者掌握Java语言的基础以及面向对象编程的核心思想。下面将详细阐述Java面向对象编程的基本概念、特性及其在实际开发中的应用。 1. ...
在这个压缩包中,"LR.C"文件很可能是一个用C语言编写的LR分析器的源代码。为了理解和分析这个程序,我们需要具备以下基础知识: 1. **语法分析**:这是编译过程的第二阶段,即词法分析后的下一步。LR分析属于自底...