这些是什么类型的java构造函数?构造函数链接?

时间:2012-02-09 02:21:00

标签: java spring constructor constructor-chaining

这些来自github上的spring amqp示例 https://github.com/SpringSource/spring-amqp-samples.git 这些是什么类型的java构造函数?他们是吸气者和制定者的简称吗?

public class Quote {

    public Quote() {
        this(null, null);
    }

    public Quote(Stock stock, String price) {
        this(stock, price, new Date().getTime());
    }

反对这一个

public class Bicycle {

public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
}

3 个答案:

答案 0 :(得分:5)

重载这些构造函数以使用this(...)调用另一个构造函数。第一个no-arg构造函数使用null参数调用第二个。第二个调用第三个构造函数(未显示),它必须使用StockStringlong。这种称为构造函数链接的模式通常用于提供多种实例化对象而无需重复代码的方法。参数较少的构造函数使用默认值填充缺少的参数,例如使用new Date().getTime(),或者只传递null s。

请注意,必须至少是一个不调用this(...)的构造函数,而是提供对super(...)的调用,然后是构造函数实现。如果在构造函数的第一行上未指定this(...)super(...),则隐含对super()的无参数调用。

因此假设Quote类中没有更多的构造函数链接,第三个构造函数可能如下所示:

public Quote(Stock stock, String price, long timeInMillis) {
    //implied call to super() - the default constructor of the Object class

    //constructor implementation
    this.stock = stock;
    this.price = price;
    this.timeInMillis = timeInMillis;
}

另请注意,对this(...)的调用仍然可以执行,但这与链接模式不同:

public Quote(Stock stock, String price) {
    this(stock, price, new Date().getTime());

    anotherField = extraCalculation(stock);
}

答案 1 :(得分:1)

这就是我们所说的伸缩模式。但是你在Quote类中使用的方式没有用。例如,假设在您的类中有一个必需属性和两个可选属性。在这种情况下,您需要提供具有该required属性的构造函数,然后在该构造函数中,您需要使用可选参数的默认值调用其他构造函数。

// Telescoping constructor pattern - does not scale well!
public class NutritionFacts {
private final int servingSize; // (mL)  required
private final int servings; // (per container) required
private final int calories; //  optional
private final int fat; // (g) optional
private final int sodium; // (mg) optional
private final int carbohydrate; // (g)   optional
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFacts(int servingSize, int servings,
int calories, int fat) {
this(servingSize, servings, calories, fat, 0);
}

我从有效的java版本2中提取这个java代码。

答案 2 :(得分:0)

它调用一个带整数参数的构造函数。

这是我在Java Tutorials网页上找到的:

  

您可以使用此方法在实例方法或构造函数中引用当前对象的任何成员。

在这种情况下,它从ArrayList类调用一些东西。这也在Java Tutorials部分中:

  

在构造函数中,您还可以使用this关键字来调用同一个类中的另一个构造函数。这样做称为显式构造函数调用。

所以你在这种情况下看到的是显式构造函数调用

来源:https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html