Абстрактный класс с окончательным неинициализированным полем - PullRequest
47 голосов
/ 24 февраля 2010

Мне было интересно, имеет ли смысл приведенный ниже код, так как компилятор предупреждает, что «пустые конечные объекты поля не могли быть инициализированы». Есть ли лучший способ сделать это?

public abstract Test {
  protected final ArrayList<Object> objects;
}

public TestSubA extends Test {

  public TestSubA() {
    objects = new ArrayList<Objects>(20);
    // Other stuff
  }
}

public TestSubB extends Test {

  public TestSubB() {
    objects = new ArrayList<Objects>(100);
    // Other stuff
  }
}

Ответы [ 4 ]

42 голосов
/ 24 февраля 2010

Я бы сделал поле final и заставил бы конструкторы передавать значение вверх:

public abstract class Test {
  private final ArrayList<Object> objects;

  protected ArrayList<Object> getObjects() {
    return objects;
  }

  protected Test(ArrayList<Object> objects) {
    this.objects = objects;
  }
}

public class TestSubA extends Test {

  public TestSubA() {
    super(new ArrayList<Object>(20));
    // Other stuff
  }
}

public class TestSubB extends Test {

  public TestSubB() {
    super(new ArrayList<Object>(100));
    // Other stuff
  }
}
5 голосов
/ 14 июля 2014

Проблема с инициализацией конечных параметров непосредственно в конструкторе подклассов заключается в том, что вам нужно сделать все это в одной строке, так как super () должен быть первым оператором конструктора. Поэтому вместо этого я предпочитаю сделать конструктор закрытым и создать статический метод сборки, подобный этому:

public abstract class Test {
  protected final ArrayList<Object> objects;

  protected Test(ArrayList<Object> objects) {
    this.objects = objects;
  }
}

public class TestSubA extends Test {
  public static TestSubA build() {
    ArrayList<Object> objects = new ArrayList<Object>(20);
    objects.put(...);
    // Other stuff
    return new TestSubA(objects);
  }

  private TestSubA(ArrayList<Object> objects) {
    super(objects);
  }
}
2 голосов
/ 24 февраля 2010

Создайте объекты в конструкторе абстрактного класса и просто передайте разницу этому конструктору.

0 голосов
/ 24 февраля 2010

Вообще говоря, может быть лучше иметь конструктор в базовом классе, который всегда устанавливает поле, и не иметь конструктора по умолчанию, который его не устанавливает. Затем подклассы могут явно передавать параметр в первой строке своего конструктора, используя super (value)

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