Проектирование объектов инициализации 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...)
}
0
nl ja de

3 ответы

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

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

например

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.)
4
добавлено

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

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

1
добавлено
Спасибо огромное! Я определенно исследую эти условия. +1
добавлено автор Luke Taylor, источник

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

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async