Sto scrivendo un metodo in Java:SECCO: Ridurre al minimo il codice ripetuto in Java
List<Foo> computeFooList(/* arguments */)
{
/* snip */
}
mi piacerebbe scrivere un secondo metodo con esattamente la stessa logica, ma un diverso tipo di ritorno:
List<String> computeStringList(/* same arguments */)
{
/* snip */
}
Sto cercando di capire un modo non-hackish per ridurre al minimo la quantità di codice ripetuto tra i due metodi. L'unica differenza logica tra i due è che, quando si aggiunge un oggetto alla lista che restituito, il primo metodo aggiunge l'acutal Foo
:
List<Foo> computeFooList(/* arguments */)
{
List<Foo> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo);
}
}
...
return toReturn;
}
e il secondo aggiunge una String
rappresentazione del Foo
:
List<String> computeStringList(/* same arguments */)
{
List<String> toReturn = ...
...
for (Foo foo : /* some other list of Foo */)
{
if (/* some condition */)
{
toReturn.add(foo.toString());
}
}
...
}
In realtà, non è proprio quello semplice. Non voglio aggiungere uno a toReturn
a meno che non sia assolutamente sicuro che appartenga a questo. Di conseguenza, tale decisione viene presa per- foo
utilizzando le funzioni di supporto. Con due diverse versioni dei metodi, avrei bisogno di diverse versioni delle funzioni di supporto - alla fine, scriverò due serie di metodi quasi identici, ma per un piccolo tipo generico.
Posso scrivere un singolo metodo che contiene tutta la logica decisionale, ma in grado di generare sia un List<Foo>
o un List<String>
? È possibile farlo senza utilizzare i tipi di tipo List
non elaborati (cattiva pratica in terreni generici!) O caratteri jolly List<?>
? Immagino un'implementazione che sembra qualcosa di simile:
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 */
}
C'è, modo elegante bello fare questo? Ho giocato con metodi generici, ma non riesco a vedere un modo per farlo. Anche il vagare con la riflessione non mi ha portato da nessuna parte (forse ho bisogno di qualcosa come TypeToken
? ... eww).
Potreste essere interessati a questo nuovo sito StackExchange: http://codereview.stackexchange.com/ – Mchl
@Mchl: ** gah * * - ora è lo –