Как вызвать super (...) и this (...) в случае перегруженных конструкторов? - PullRequest
11 голосов
/ 06 августа 2011

Мне никогда не приходилось делать это раньше, но, поскольку обе должны быть «первой» строкой в ​​конструкторе, как с этим бороться? Какой лучший рефакторинг для такой ситуации?

Вот пример:

public class Agreement extends Postable {


public Agreement(User user, Data dataCovered)
{
    super(user);
    this(user,dataCovered,null);

}

public Agreement(User user,Data dataCovered, Price price)
{
    super(user);

    if(price!=null)
        this.price = price;

    this.dataCovered = dataCovered;


}
   ...
}

Звонок на super(user) абсолютно необходим. Как бороться с «необязательными параметрами» в этом случае? Единственный способ, которым я могу думать, - это повторение, то есть вообще не называть это (...). Просто выполняйте задания в каждом конструкторе.

Ответы [ 4 ]

13 голосов
/ 06 августа 2011

Вы не можете называть как супер (..), так и это (...). Что вы можете сделать, так это переработать структуру ваших перегруженных конструкторов, чтобы последний из них вызвал super (...). Если это не вариант, вам придется выполнять назначения в каждом конструкторе.

6 голосов
/ 06 августа 2011

Если вы вызовете this(user,dataCovered,null), будет вызван второй конструктор, и первое, что он сделает, - это вызовите суперпроектор. Поэтому строка super(user); в первом конструкторе не нужна.

0 голосов
/ 06 августа 2011

Я бы выделил логику, которую нужно выполнить в конструкторе в статическом методе класса, и просто вызвал бы его из обоих конструкторов, чтобы избежать дублирования. Однако в вашем случае вы можете просто пропустить вызов super(user) из первого конструктора, а второй вызовет его для вас :). И я бы поменял "зависимости" между конструкторами, вот так:

public class Agreement extends Postable {


public Agreement(User user, Data dataCovered)
{
    super(user);
    setDataCovered(dataCovered);

}

public Agreement(User user, Data dataCovered, Price price)
{
    this(user, dataCovered);

    if(price!=null)
        setPrice(price);

}

private static void setDataCovered(Data dataCovered) {
     this.dataCovered = dataCovered;
}

private staitc void setPrice(Price price) {
     this.price = price;
}
}
0 голосов
/ 06 августа 2011

В конструкторах есть (среди прочего, например, вызов методов не экземпляра из или внутри super или this) этих трех ограничений:

  • Только один вызов super(...) или this(...) на конструктор
  • super или this всегда должны быть первым оператором в методе
  • Если вы не предоставите ни одного из них, у вас будет неявное super() в начале конструктора

Причина в том, что объект может быть создан только один раз.И super создает объект, вызывая перегруженный конструктор, в то время как он делегирует другому конструктору того же класса.

Как говорит другой ответ, в вашем случае вам не нужен первый super в качестве вашегоthis оператор делегирует другому конструктору, который уже вызывает super(user).

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