Я пишу метод на Java:
List<Foo> computeFooList(/* arguments */)
{
/* snip */
}
Я хотел бы написать второй метод с точно такой же логикой, но с другим типом возврата:
List<String> computeStringList(/* same arguments */)
{
/* snip */
}
Я пытаюсь найти нехакерский способ минимизировать количество повторяющегося кода между двумя методами.Логическое различие между ними * заключается в том, что при добавлении объекта в возвращаемый список первый метод добавляет значение Foo
:
List<Foo> computeFooList(/* arguments */)
{
List<Foo> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo);
}
}
...
return toReturn;
}
, а второй -String
представление Foo
:
List<String> computeStringList(/* same arguments */)
{
List<String> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo.toString());
}
}
...
}
На самом деле, это не совсем 1018 *, что просто.Я не хочу добавлять Foo
к toReturn
, если я не уверен, что он там есть.В результате это решение принимается за foo
с использованием вспомогательных функций.С двумя разными версиями методов мне также потребуются разные версии вспомогательных функций - в конце я бы написал два набора почти одинаковых методов, но для одного небольшого универсального типа.
Могу ли я написать единственный метод, который содержит всю логику принятия решений, но может генерировать или List<Foo>
или List<String>
?Возможно ли это сделать без использования необработанных List
типов (плохая практика в универсальных землях!) Или подстановочных знаков List<?>
типов?Я представляю реализацию, которая выглядит примерно так:
List<Foo> computeFooList(/* args */)
{
return computeEitherList(/* args */, Foo.class);
}
List<String> computeStringList(/* args */)
{
return computeEitherList(/* args */, String.class);
}
private List<???> computeEitherList(/* args */, Class<?> whichType)
{
/* snip */
}
Есть ли какой-нибудь хороший, элегантный способ сделать это? Я играл с универсальными методами, но я могу 'не вижу способа сделать это.Даже гадость с отражением никуда меня не привела (может быть, мне нужно что-то вроде TypeToken
? ... eww).