不管是构造方法还是静态工厂方法,都存在一个问题,就是在创建对象时要传入n多参数,这次要说的是使用构造器。
举个例子说明这样做的好处,先看使用构造方法的情况:
public class Person {
private String name; // 必须
private boolean gender; // 必须
private int age; // 可选
private int height; // 可选
private int weight; // 可选
private String description; // 可选
public Person(String name, boolean gender) {
this(name, gender, 18);
}
public Person(String name, boolean gender, int age) {
this(name, gender, age, 170);
}
public Person(String name, boolean gender, int age, int height) {
this(name, gender, age, height, 50);
}
public Person(String name, boolean gender, int age, int height, int weight) {
this(name, gender, age, height, weight, "");
}
public Person(String name, boolean gender, int age, int height, int weight, String description) {
this.name = name;
this.gender = gender;
this.age = age;
this.height = height;
this.weight = weight;
this.description = description;
}
}
调用的时候,我们可能会使用:
Person p = new Person("Sirius",false,25,165,50,"a cute girl");
如果我们只是想设置简介,也必须要把6个参数全都输入,很恶心的,这样既不便于书写,也不便于阅读。
好了,看看构造器的强大吧,把上面的代码写成构造器的方式:
public class Person {
private String name; // 必须
private boolean gender; // 必须
private int age; // 可选
private int height; // 可选
private int weight; // 可选
private String description; // 可选
public static class Builder {
// 必须
private String name;
private boolean gender;
// 可选,设置默认值
private int age = 18;
private int height = 170;
private int weight = 50;
private String description = "";
public Builder(String name, boolean gender) {
this.name = name;
this.gender = gender;
}
public Builder age(int val){
age = val;
return this;
}
public Builder height(int val){
height = val;
return this;
}
public Builder weight(int val){
weight = val;
return this;
}
public Builder description(String val){
description = val;
return this;
}
public Person build() {
return new Person(this);
}
}
private Person(Builder builder) {
this.name = builder.name;
this.gender = builder.gender;
this.age = builder.age;
this.height = builder.height;
this.weight = builder.weight;
this.description = builder.description;
}
}
貌似比刚才复杂了一些,看看调用的时候吧
Person p = new Person.Builder("Sirius", false).age(25).height(165).description("a cute girl"),build();
好多了吧,清晰明了,用到哪个就写哪个,多方便啊。
分享到:
相关推荐
2 章 创建和销毁对象(创建和气氛对象)第二章简介(章节介绍)第 1 条考虑静态工厂方法而不是构造函数(考虑以静态工厂方法代替构造函数)Item 2: 当面对许多构造函数参数时考虑构建器(在面对多个构造函数参数时,...
当面对多分类任务时,有多种策略可以实现,如一对一、一对多和多对多等。本场景中提到的是基于特征空间的SVM多分类器,这通常意味着构建多个SVM分类器,每个分类器负责一个特定类别与其余类别的区分。 “特征空间...
如果类有参数化的构造器,我们需要使用`Constructor`类来获取构造器,并通过`newInstance()`方法传入参数。 字段访问和修改是反射的另一个重要方面。`Field`类代表类的成员变量。我们可以使用`get()`和`set()`方法...
* 创建窗体有两种方法,先来介绍第一种方法,可以直接使用 JFrame 窗口类的构造器来创建一个简单的窗体。 8. 创建 Frame 窗体的实例: * 使用 JFrame 窗口类的构造器来创建一个 Frame 窗体的实例。 * 设置窗口的...
文章指出,在面对多管芯组合结构的激光器时,提取等效电路参数是一项具有挑战性的任务。为解决这一问题,作者提出了一个简便的方法。 该方法的核心在于,不需要了解半导体激光器的具体材料和内部构造,而是通过实际...
1. 构造器:用于初始化新创建的对象,Java提供了默认构造器和自定义构造器。 2. 枚举:Java枚举是一种特殊的类,用于定义固定的常量集合。 3. 抽象类与接口:抽象类可以有方法实现,而接口只包含抽象方法和常量,...
5. **构造器**:构造器是类的一个特殊方法,用于初始化新创建的对象。Java中的构造器与类名相同,无返回类型。通常,你会在构造器中设置对象的初始状态。 6. **访问控制修饰符**:如public、private、protected和...
在`Person`类中,我们可以定义一个构造器,接受姓名作为参数,创建新的人物时,直接指定其姓名。 7. 异常处理: 在实际编程中,可能会遇到一些异常情况,如换装失败等。此时,可以使用Java的异常处理机制,通过`try...
- 构造器:构造器用于初始化新创建的对象,通常与类同名且无返回值。 - 访问修饰符:public、private、protected和默认访问级别控制类、成员变量和方法的可见性。 - 方法重载和重写:方法重载是在同一类中定义多个...
2. 方法引用与构造器引用:除了Lambda,JDK 8还引入了方法引用和构造器引用,可以直接引用类或对象的已存在方法和构造器,进一步提高了代码的简洁性。 3. Stream API:Stream API为处理集合提供了新的方式,支持...
- 构造器:理解构造器的作用,知道无参构造器和带参数构造器的应用场景。 - 内部类:了解匿名内部类、成员内部类和局部内部类。 - 异常处理:理解异常分类,何时使用try-catch-finally,以及如何自定义异常。 2....
- **构造器**:掌握构造器的使用,包括默认构造器、带参数的构造器和构造器的链。 - **抽象类与接口**:理解抽象类与接口的区别和应用场景,以及如何实现接口。 3. **异常处理** - **异常分类**:了解Checked...
5. 构造器与析构器:理解构造器的作用,以及 finalize 方法的使用场景。 三、异常处理 1. 异常分类:了解Checked异常和Unchecked异常的区别。 2. try-catch-finally:掌握异常处理的基本结构,理解finally块的作用...
在控制系统理论中,鲁棒控制是一种设计方法,旨在确保控制器在面对参数不确定性或外部扰动时仍能保持稳定性和性能。 鲁棒控制的核心思想是设计控制器,使其在系统参数变化或存在不确定性的范围内仍能有效工作。对于...
集成学习方法如随机森林、梯度提升机等能够通过组合多个基学习器提升模型性能。通过比较这些方法的优缺点,你将能更好地选择适合特定问题的分类器,并通过实验评估它们的性能。 最后,概率估计是模式识别中的重要...
2. 特征工程:通过统计分析和业务理解,构造新的特征,如借款人还款意愿的指标、贷款风险等级等,这些新特征可能包含更多的欺诈信息。 3. 建立基础模型:选择合适的弱预测器,如决策树、随机森林等,对训练集进行...
2. 方法的调用:通过反射调用私有方法和构造器。 3. 注解处理:了解注解的定义和使用,以及如何在运行时通过反射读取注解信息。 八、JVM内存管理 1. 堆内存与栈内存:理解两者的区别和作用。 2. 内存区域:了解程序...
- **应用场景**:调用方法时不清楚参数顺序或类型时使用。 24. **Alt + Insert** - **作用**:快速生成代码。可以自动生成构造函数、getter/setter 等代码模板。 - **应用场景**:创建新的类或方法时使用,可以...