Как правильно объявить объекты класса? - PullRequest
1 голос
/ 20 мая 2011

Это всего лишь быстрый вопрос для урегулирования спора, который я наткнулся на некоторое время назад (извините, у меня нет ссылки).

Как я объявлял объект так:

class Foo {

   private Bar aBar = new Bar();

   ...

}

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

TFYT

~ Aedon

Edit 1:

Я знаю, что использовал слово спор,но я не собираюсь спорить с этим.

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

В большинстве случаев это не имеет значения.Мое эмпирическое правило таково:

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

Причина: при инициализации в точке объявления получается clear что значение будет присвоено одинаково независимо от конструктора и параметров.Это также делает ваши конструкторы более простыми и свободными от дублирования.

Предостережение: не также присваивайте значение в конструкторе, так как в противном случае это лишает законной силы предыдущую ясность:)

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

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

2 голосов
/ 20 мая 2011

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

1 голос
/ 20 мая 2011

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

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

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