在一个类有很多的值要初始化时,可以通过在构造函数中给它传初始值,例如:
这这样的构造函数给调用者带来了很多的不便,会引起调用者分不清各个参数的意义,代码也不容易读。
另外一种方法是使用JavaBean。既是在构造函数中只给出必要的初始化参数,可选参数以setter的方式来设置,例如:
但是JavaBean的形式是把初始参数各构造一个类的实例分开来完成的,但是这种形式的自由度太大,可以在任何时候改变实例的属性值。
最好的一种方式是为这样的类写一个内部的Builder。如下:
然后通过这种方式来调用:
package com.qualityeclipse.sample;
import java.util.Date;
public class Timezone {
private final float offset;
private final float asc;
private final String name;
private final String id;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public float getOffset() {
return offset;
}
public float getAsc() {
return asc;
}
public String getName() {
return name;
}
public String getId() {
return id;
}
private Timezone(Builder builder) {
offset = builder.offset;
asc = builder.asc;
name = builder.name;
id = builder.id;
}
public static class Builder {
private float offset;
private float asc;
private String name;
private String id;
public Builder offset(float offset) {
this.offset = offset;
return this;
}
public Builder asc(float asc) {
this.asc = asc;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder id(String id) {
this.id = id;
return this;
}
public Timezone build() {
return new Timezone(this);
}
}
}
以上内容选自:《Effective Java》第二版 英文版第11页至第15页。
分享到:
相关推荐
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种...注意:构造函数可以被重载,可以多个,可以带参数;析构函数只有一个,不能被重载,不带参数 而默认构造函数没有参数,它什么也不做
本篇文章将详细探讨如何在WPF环境中,使用MEF来导入具有参数构造函数的用户控件。 首先,理解MEF的基本概念是至关重要的。MEF是一种轻量级的插件框架,允许开发者创建松散耦合的应用程序。它通过提供一种方式来发现...
如果没有在派生类的初始化列表中指定,编译器会默认调用基类的无参数构造函数(如果存在的话)。例如: ```cpp class Derived : public Base { public: Derived() { // 默认调用Base的无参构造函数 // ... } ...
构造函数是一个与类同名的方法,可以没有参数,有一个参数或多个参数,但是构造函数没有返回值。如果构造函数没有参数,该函数被称为类的默认构造函数。 (1) 一个类可以包含多个构造函数,各个构造函数之间通过...
构造函数可以被重载,这意味着一个类可以有多个构造函数,但每个构造函数的参数列表必须不同。 在提供的代码示例中,定义了一个名为`Student`的类,其中包含了一个构造函数: ```cpp Student(int n, string nam, ...
在C++编程中,对象的构造过程涉及到多个层面,包括对象成员构造函数、基类构造函数以及派生类本身的构造函数。理解它们的执行顺序对于编写健壮的代码至关重要。以下将详细阐述这三个构造函数的调用时机和逻辑。 1. ...
对于`st1`,因为没有传递任何参数,所以`Student`的无参数构造函数被调用,接着它调用了`Person`的无参数构造函数。对于`st2`,调用了`Student`的三参数构造函数,但由于`Person`类没有匹配的构造函数,编译器会报错...
声明一个带参数的构造函数,该构造函数继承基类base中的带参数的构造函数
3. **构造函数重载与父类构造函数的选择**:如果父类中有多个构造函数,子类可以通过`super()`后跟相应的参数列表来选择调用哪一个父类构造函数。 例如: ```java class Base { public Base() { System.out....
构造函数可以带参数,也可以不带参数,并且可以指定参数的缺省值。 构造函数的特点: 1. 构造函数名字必须与类名相同。 2. 构造函数是成员函数,函数体可写在类体内,也可写在类体外。 3. 构造函数是一个特殊的...
- **使用多个构造函数**:类可以定义多个构造函数,这些构造函数可以有不同的参数列表。这种灵活性使得类可以在不同的情况下使用不同的初始化逻辑。 - **构造函数重载**:通过定义多个具有不同参数列表的构造函数,...
在上面的代码中,我们使用了两个构造函数来实例化ming对象,第一个构造函数没有参数,第二个构造函数有两个参数likes和hope。 在子类中,我们可以使用super关键字来调用父类的构造函数,例如: ```java public ming...
构造函数可以被重载,即在同一个类中可以有多个具有不同参数列表的构造函数。 静态块(`static`)是在类定义中包含的一段特殊的代码块,它在类加载时执行,而不是在对象创建时执行。静态块常用于初始化静态变量或...
在C#中,构造函数可以有多个,但它们的方法签名不能相同。 默认构造函数是无参数的构造函数。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。如果类不是静态的,C#编译器...
5. **构造函数重载**:一个类可以有多个构造函数,它们的参数列表不同,这种现象称为构造函数的重载。这使得我们可以根据需要以不同的方式创建对象。 6. **构造函数链**:当一个类继承自另一个类时,子类的构造函数...
- **定义**:当一个类没有定义任何构造函数时,编译器会自动生成一个默认的无参数构造函数。此构造函数为空,不做任何操作。 - **示例**: ```cpp class Complex { public: Complex() { m_real = 0.0; m_imag ...
当一个类有多个构造函数,每个函数具有不同的参数列表时,我们称这种情况为构造函数的重载(Overloaded Constructors)。这种特性使得我们可以根据需要以不同的方式创建类的对象,提高了代码的可读性和灵活性。 ...
构造函数可以有参数,也可以无参数,根据不同的参数列表,我们可以定义多个重载的构造函数,以便在创建对象时提供不同的初始化方式。 构造函数分为两种类型:默认构造函数和自定义构造函数。默认构造函数是编译器...
综上所述,这个"C#多态性实例,向基类构造函数传递参数"的示例展示了如何在C#中利用多态性、继承和构造函数来创建灵活、可扩展的代码结构。通过理解和应用这些概念,开发者可以编写出更高效、更具维护性的软件系统。
- **多个构造函数**:尽管Python不支持多重构造函数的概念(即一个类不能有多个不同签名的构造函数),但我们可以通过提供默认参数值来模拟多重构造函数的效果。例如,可以在构造函数中设置某些参数的默认值,从而...