Проектирование конструкторов вокруг стирания типов в Java - PullRequest
3 голосов
/ 24 апреля 2010

Вчера я разрабатывал Java-класс, который хотел инициализировать списками различных универсальных типов:

TheClass(List<String> list) {
   ...
}

TheClass(List<OtherType> list) {
   ...
}

Это не скомпилируется, поскольку конструкторы имеют одинаковое стирание.

Я просто использовал фабричные методы, различающиеся по именам:

public static TheClass createWithStrings(List<String> list)
public static TheClass createWithOtherTypes(List<OtherType> list)

Это менее чем оптимально, поскольку не существует ни одного очевидного места, где доступны все различные варианты создания экземпляров.

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

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Мне бы хотелось узнать аккуратное решение этой проблемы.

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

1 голос
/ 24 апреля 2010

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

Я бы предложил использовать метод создания с именем, основанным на интерпретации типов. String само по себе не имеет большого значения. createWithThingNames или что-то.

Некоторые языки со статической типизацией вообще не имеют перегрузки методов (намеренно).

0 голосов
/ 24 апреля 2010

Разные решения:

1) с вкладками

class TheClass
{
 TheClass(String[] strings)   {}
 TheClass(Object[] others) {}
}

2) с генериками

class TheClass<P>
{
 TheClass(P generic) {}
}
...