Как правильно вызвать суперконструктор - PullRequest
2 голосов
/ 24 марта 2010

Так вот мой код:

public MyClass (int y) {
    super(y,x,x);
    //some code
}

Моя проблема в том, что в этом случае я хочу сгенерировать 'x' и отправить его в конструктор super. Однако вызов суперконструктора должен быть первой строкой в ​​этом конструкторе. Конечно, я мог бы сделать что-то вроде этого:

int x;
{
    x = generateX();
}

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

Ответы [ 3 ]

12 голосов
/ 24 марта 2010

Как насчет:

public MyClass(int y) {
  this(y, generateX());
  //some code
}

private MyClass(int y, int x) {
  super(y, x, x);
  //some code
}

private static int generateX() {
  return 10;
}

Если вы счастливы, что generateX вызывается дважды, вам не нужен дополнительный конструктор - он просто позволяет использовать одно и то же значение для обоих параметров конструктора суперкласса.

2 голосов
/ 24 марта 2010

Как насчет super(y, generateX(), generateX())

0 голосов
/ 24 марта 2010

A builder pattern также может быть уместным здесь. Немного тяжелый вес для данного примера, но если необходимо выполнить дальнейшую настройку для MyClass, это следует учитывать.

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