Можно ли ссылаться на «это» при инициализации поля? - PullRequest
3 голосов
/ 21 апреля 2010

Можно ли ссылаться на this при инициализации поля?

public class MainClass {

  private SomeFieldClass field = new SomeFieldClass(this);

  public MainClass() {}

}

Или лучше сделать это в конструкторе?

public class MainClass {

  private SomeFieldClass field;

  public MainClass() {
    this.field = new SomeFieldClass(this);
  }

}

Каков наилучший метод?Я считаю, что первый вариант лучше подходит для модульного тестирования и внедрения зависимостей.Есть ли с этим проблемы?

Ответы [ 3 ]

4 голосов
/ 21 апреля 2010

Разрешение экранирования ссылки this (оба стиля в вопросе) до того, как конструктор завершит выполнение, является плохим (1) в многопоточных приложениях и (2), когда расширение MainClass расширяется.

4 голосов
/ 21 апреля 2010

Вопрос немного неясен. Вас беспокоит передача этого вашему конструктору, или использование this.field в теле конструктора, или инициализация поля в конструкторе, а не в теле класса?

Лично я предпочитаю использовать этот префикс при обращении к ученикам, но это вопрос стиля.

Я также предпочитаю не делать инициализации неконстант в теле класса. Я считаю, что для более длинных классов лучше иметь все инициализации в одном заданном месте (например, в конструкторе), а не визуально сканировать объявления для определения начальных значений.

Если вы спрашиваете об этом раньше (проблема в обоих примерах), я чувствую, что это зависит от того, можете ли вы иметь дело с возможностью того, что цель сделает что-то с частично инициализированным объектом. Я предпочитаю отделять такие создания от других и явно вызываемых функций (например, createAssociatedSomeObject ())

2 голосов
/ 21 апреля 2010

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

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