Java — как бороться со стиранием типов в конструкторах?

Скажем, у меня есть два конструктора в моем классе:

public User (List source){
...
}

public User (List source) {
...
}

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

В Java вы не можете сделать это из-за стирания типов. --Java не принимает два конструктора с параметрами List.

Итак, как это обойти? Что такое решение, которое не является излишним, но при этом уважает основы объектно-ориентированного программирования? Кажется неправильным создавать фабричный метод или другой интерфейс вокруг этого только потому, что Java не имеет сильной поддержки дженериков.

Вот возможности, о которых я могу думать:

1 )Примите Listв качестве параметра для конструктора и проанализируйте в конструкторе, какая логика вам нужна,или сгенерировать исключение, если это не какой-либо из допустимых типов.

2 )Создайте класс, который принимает любой список, создает соответствующий объект пользователя и возвращает его.

3 )Создайте оболочки вокруг Listи List, которые вместо этого можно передать конструктору пользователя.

4 )Подкласс этого парня с двумя классами, где наследуется вся функциональность, кроме конструктора. Конструктор одного принимает Source1, другой принимает Source2.

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

Мои вопросы таковы:

1 )Является ли это недостатком Java или преднамеренным дизайнерским решением? Что такое интуиция?

2 )Какое решение является самым сильным с точки зрения поддержания хорошего кода без внесения ненужной сложности? Почему?

Этот вопрос аналогичен:Разработка конструкторов на основе стирания типов в Java , но не вдается в подробности, а просто предлагает различные варианты работы -.

18
задан Community 23 May 2017 в 12:25
поделиться