构造方法中传递的参数一般是必要参数,如果一个类,有必要的属性,还有可选的属性,那可用Builder构造器 建立对应的类
例:类Nutrition 有必要属性servings,servings,可选属性为calories,fat,sodium,carbohydrate
public class Nutrition {
//parameters
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
//requierd parameters
private final int servingSize;
private final int servings;
//optional parameters
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int var) {
this.calories = var;
return this;
}
public Builder fat(int var) {
this.fat = var;
return this;
}
public Builder sodium(int var) {
this.sodium = var;
return this;
}
public Builder carbohydrate(int var) {
this.carbohydrate = var;
return this;
}
//Don't forgot
public Nutrition build() {
return new Nutrition(this);
}
}
//construction
private Nutrition(Builder builder) {
this.servingSize = builder.servings;
this.servings = builder.servings;
this.calories = builder.calories;
this.fat = builder.fat;
this.sodium = builder.sodium;
this.carbohydrate = builder.carbohydrate;
}
}
代码分析:
(1)写Nutrition 类的属性
为减少类成员的可访问性,将所有Nutrition 类属性定义为private final类型
(2)建立Builder类,写Builder类的属性
定义Builder为public static class,写属性时区分必要或可选,必要用private final类型,可选用private,并且定义简单的初值,假定为0、null或其他
(3)处理必要属性,建立Builder类的构造方法
将必要的属性放入Builder的属性中,例子中为servings和servingSize
(4)处理可选属性,建立Builder类的其他类
每个方法先修改calories、fat等参数,然后返回Builder自身
(5)builder方法
先调用Nutrition 的构造方法,将自己传过去,返回一个new Nutrition。此方法我认为是很容易忘记的地方,最起码我写时忘了汗
,Builder完成。
(6)完善Nutrition的构造方法
将 Builder中的所有属性copy到自身中,全是this.xxx = builder.xxx
(7)方法调用
Nutrition n = new Nutrition.Builder(100,200).fat(230).sodium(120).build();
第二条 遇到多个构造器参数时要考虑用构建器,此方法好像用的不多,使用范围不了。。。
分享到:
相关推荐
在构建词法分析器时,我们需要考虑以下关键概念和步骤: 1. **词法规则**:定义每个标记的模式,例如,关键字“if”,数字模式,标识符等。 2. **状态转换**:通过DFA,根据当前读取的字符决定词法分析器应进入的下...
第2章着重讲解了构造器模式,这是一种创建型设计模式,它关注的是对象的初始化过程。下面将详细阐述构造器模式的相关知识点,并结合提供的文件名来推测可能的学习内容。 首先,让我们理解构造器模式的基本概念。在...
解释器的构造涉及到多个关键步骤,包括词法分析、语法分析、语义分析和代码生成。下面我们将详细探讨这些步骤以及它们在实验中的重要性。 1. **词法分析**:这是解释器的第一步,它将源代码分解成一系列称为“标记...
词法分析器的构造是编译器设计与实现的重要组成部分,涉及到了状态转移、正则表达式等多个概念。 1. **词法分析器的作用** 词法分析器的作用是将源代码中的字符流转化为符号流,这个过程包括识别关键字、标识符、...
**遇到多个构造器参数时的考虑**: - **重叠构造器模式**:这种模式下,每个构造器提供比前一个多一个参数,但是这种模式会导致构造器过多,增加复杂度。 - **JavaBeans模式**:虽然使用无参构造器并结合setter方法...
在编程领域,编译原理是理解计算机语言转换...此外,了解词法分析器的构造也有助于将来在阅读和理解编译器源代码时更加得心应手,对于想要深入研究编译技术或者从事相关开发工作的人来说,这是一个非常宝贵的实践机会。
在构建语法分析器时,我们需要使用LL(1)方法来生成分析表。 LL(1)文法是一种特定的上下文无关文法,它具有两个性质:左递归和左因子。左递归是指在产生式中,左部和右部的开头符号相同,而左因子是指左部和右部...
每个单元格中包含一个或多个产生式,表示当前非终结符遇到特定输入符号时应执行的动作。如果一个非终结符在某个输入符号下有且只有一个产生式,那么这个分析器就是LL(1),"1"表示只看一个输入符号就能决定下一步行动...
《计算机编译原理编译程序构造实践第二版》是由张幸儿编著的一部深入探讨编译技术的著作。该书结合丰富的实例,为读者提供了实际动手构建编译器的宝贵经验,旨在帮助读者将理论知识转化为实际操作能力,避免学习后...
在 Laravel 中,开发者可以利用其丰富的工具和库来提高开发效率,而 "Former" 正是这样一个专为 Laravel 设计的表单构造器。 Former 是一款强大的第三方库,它的主要目标是帮助 Laravel 开发者快速、方便地创建和...
或者,我们可以预先定义好层的列表,然后一次性传递给Sequential构造器: ```python layers = [Dense(2)] model = Sequential(layers) ``` 对于输入层,我们需要指定输入维度,这可以通过`input_dim`属性完成。...
第2章 生成、打包、部署和管理应用程序及类型 2.1 .NET Framework部署目标 2.2 将类型生成到模块中 2.2.1 响应文件 2.3 元数据概述 2.4 将模块合并成程序集 2.4.1 使用Visual Studio IDE将程序集添加到项目中...
在这个过程中,编译器分为多个阶段,主要包括词法分析、语法分析、语义分析和代码生成。 词法分析是编译程序的第一个阶段,它的任务是将源代码分解成一个个称为“token”的基本单元,这些token可以是关键字、标识符...
每个类可以有多个构造器,通过构造器链(调用超类的构造器)确保对象正确初始化。 6. **接口**:接口在Java中是一种完全抽象的类,只能包含常量和抽象方法。它用于实现多继承,使得不相关的类可以共享相同的接口。...
第二版的《Java面向对象程序设计》课件旨在深入浅出地介绍这一关键概念,帮助学习者掌握Java语言的基础以及面向对象编程的核心思想。下面将详细阐述Java面向对象编程的基本概念、特性及其在实际开发中的应用。 1. ...
1. **正则表达式**:学习如何用正则表达式来定义语言的词法规则,这是构建词法分析器的基础。 2. **有限状态自动机(FSM)**:词法分析器通常通过有限状态自动机来实现,这是一类数学模型,用于识别特定的字符序列。...
H[1,2] = 序列的第二个元素 ... H[N,N-1] = 序列的最后一个元素 然后,其余元素通过保持下三角和上三角对称性填充,即H[i,j] = H[j,i]。 3. "HankelModel.m" 文件: 此文件可能是一个MATLAB函数,用于生成特定尺寸...
### Protege构建本体知识点详解 #### 一、概述 Protege是一款广泛使用的开源本体编辑工具,它能够帮助用户构建、管理和编辑基于OWL(Web Ontology Language)的本体。通过Protege,我们可以定义实体之间的关系,...