Проектирование объектов инициализации Java

Допустим, у меня есть объект  `foo`  из класса  `Foo` . Допустим, класс  `Foo`  имеет много полей, которые характеризуют его потомков.

При наличии большого количества полей предпочтительнее инициализировать их все через конструктор Foo, например.

```
Foo foo = new Foo(0, 12, 123, 2, 2, (and so on...));

```

или инициализировать их в конструкторе или методе из класса один будет использовать  `foo` , например.

```
Foo foo = new Foo();

public void initFoo() {
    foo.setX(1);
    foo.setY(3);
    foo.setH(3);
    (and so on...)
}

```

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

Следующим шагом будет использование  [шаблона компоновщика](https://en.wikipedia.org/wiki/Builder_pattern) . В этом случае вы предоставляете компоненту компоновщика параметры, и строитель может затем определить отсутствующие параметры и/или как построить объект.

например

```
FooBuilder fb = new FooBuilder();
fb.setX(1);
fb.setY(2);
// etc...
Foo f = fb.newInstance();

```

Сказав все это, вам нужно построить свой объект с таким количеством параметров? Это звучит так:

1. your object is doing too much on its own, or
2. those parameters can be combined into other meaningful objects (например `x` and `y` coordinates as a `point` etc.)



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

Вам понадобится этот подход, как только вы начнете писать модульные тесты для нетривиальных классов,   

где вам нужно будет издеваться над этими членами.

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



Лично я бы пошел со своей второй версией i.e Инициализация в конструкторе с помощью setX (), setY() и т. Д. Потому что у вас не будет частичного построенного объекта, а также он выглядит аккуратным и аккуратным.