Скажем, у меня есть два конструктора в моем классе:
public User (List<Source1> source){
...
}
public User (List<Source2> source) {
...
}
Скажем, что оба этих конструктора предоставляют одну и ту же информацию о пользователе и являются одинаково допустимыми способами построения пользователя для разных случаев использования.
В Java вы не можете этого сделать из-за стирания типа - Java не примет два конструктора, которые имеют в качестве параметров List <? > .
Итак, каков способ обойти это? Что такое решение, которое не переполняет, но по-прежнему уважает базовое ОО? Кажется неправильным создавать конструкцию метода factory или другого интерфейса вокруг этого только потому, что Java не имеет поддержки сильных дженериков.
Вот мои возможности:
1) Примите List<?>
в качестве параметра для конструктора и проанализируйте конструктор, какую логику вам нужно, или выбросите исключение, если оно не относится к принятым типам.
2) Создайте класс, который принимает List, создает соответствующий объект User и возвращает его.
3) Создайте обертки вокруг List<Source1>
и List<Source2>
, которые могут быть переданы вместо конструктора User.
4) Подкласс этого парня с двумя классами, где вся функциональность наследуется, за исключением конструктора. Конструктор одного принимает Source1, другой принимает Source2.
5) Оберните этого парня строителем, где два разных метода построения для двух разных источников данных для создания экземпляра.
Мои вопросы таковы:
1) Нужно ли делать это с ошибкой с Java или преднамеренным дизайнерским решением? Что такое интуиция?
2) Какое решение является самым сильным с точки зрения поддержания хорошего кода без внедрения ненужной сложности? Почему?
Этот вопрос схож: Проектирование конструкторов вокруг стирания стилей в Java, но не вникает в особенности, он просто предлагает различные варианты работы.