2010-04-24 3 views
3

Вчера, я проектировал класс Java, который я хотел быть initalized со списками различных родовых типов:Проектирование Конструкторы вокруг типа стирания в Java

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

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

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

Я просто пошел с фабричными методами дифференцируются по их именам вместо:

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

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

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

ответ

1

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

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

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

+0

Хорошая точка в именах методов. «String» является излишним, поскольку он уже находится в сигнатуре метода. –

+0

@Internet Friend: «Strign'» не имеет такого значения в типе параметра, как в имени метода. –

0

Differents решение:

1) с вкладкой

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

2) с дженерик

class TheClass<P> 
{ 
TheClass(P generic) {} 
} 
+0

Я предполагаю, что вы имеете в виду «1» с массивами », но давайте не будем туда возвращаться. Дженерики не будут работать, если поведение отличается от типа элемента, что, вероятно, является (и, следовательно, вероятно, должно быть какая-то идентификация на основе имени). –

2

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

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

+0

Это не худшее решение. Я иногда использую его. Я просто добавляю фиктивный параметр типа «Void». Scala использует тот же трюк, но параметр фиктивного неявного, поэтому на стороне вызова два метода вызова выглядят одинаково. – ZhekaKozlov

Смежные вопросы