Что это за конструкторы Java? Конструктор цепочки? - PullRequest
1 голос
/ 09 февраля 2012

Это из весенних образцов amqp на github в 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 ]

5 голосов
/ 09 февраля 2012

Эти конструкторы перегружены для вызова другого конструктора, используя this(...).Первый конструктор без аргументов вызывает второй с нулевыми аргументами.Второй вызывает третий конструктор (не показан), который должен принимать значения Stock, String и long.Этот шаблон, называемый конструктор цепочкой , часто используется для обеспечения нескольких способов создания экземпляров объекта без дублирования кода.Конструктор с меньшим количеством аргументов заполняет отсутствующие аргументы значениями по умолчанию, такими как new Date().getTime(), или просто передает null s.

Обратите внимание, что должно быть хотя бы однимконструктор, который не вызывает this(...), а вместо этого обеспечивает вызов super(...) с последующей реализацией конструктора.Когда ни this(...), ни super(...) не указаны в первой строке конструктора, подразумевается вызов no-arg для super().

Таким образом, при условии, что в * 1020 нет больше цепочек конструктора* class, третий конструктор, вероятно, выглядит следующим образом:

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 голос
/ 09 февраля 2012

Это то, что мы называем телескопической схемой. Но то, что вы использовали в классе Quote, бесполезно. Для примера подумайте, что в вашем классе у вас есть одно обязательное свойство и два необязательных свойства. В этом случае вам нужно предоставить конструктору это обязательное свойство, а затем внутри этого конструктора вам нужно вызвать другие конструкторы со значениями по умолчанию необязательных параметров.

// 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-код из действующей Java-версии 2.

0 голосов
/ 11 марта 2016

Он вызывает конструктор, который принимает целочисленный аргумент.

Это то, что я нашел на веб-странице учебников по Java:

Вы можете ссылаться на любой член текущего объекта извнутри метода экземпляра или конструктора с помощью этого.

В этом случае он вызывает что-то из класса ArrayList.Это также было в разделе «Учебники Java»:

Внутри конструктора вы также можете использовать ключевое слово this для вызова другого конструктора в том же классе.Это называется явным вызовом конструктора.

Итак, в данном случае вы видите явный вызов конструктора

Источник: https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...