Perché preferire un carattere jolly a un discriminatore di tipi in un'API Java (Re: Java efficace)

8

Nella sezione generici di Effective Java di Bloch (che è facilmente il capitolo "libero" disponibile per tutti: link ), dice:

If a type parameter appears only once in a method declaration, replace it with a wildcard.

(Vedi pagina 31-33 di quel pdf)

La firma in questione è:

public static void swap(List<?> list, int i, int j)

vs

public static void swap(List<E> list, int i, int j)

E quindi procede ad utilizzare una funzione "helper" statica privata con un parametro di tipo effettivo per eseguire il lavoro. La firma della funzione di supporto è ESATTAMENTE quella della seconda opzione.

Perché è preferibile il carattere jolly, dal momento che NON è necessario utilizzare un carattere jolly per eseguire comunque il lavoro? Capisco che in questo caso dal momento che sta modificando l'Elenco e non è possibile aggiungere a una raccolta con un carattere jolly illimitato, quindi perché utilizzarlo a tutti?

    
posta Michael Campbell 04.09.2011 - 23:09
fonte

1 risposta

5

Why is the wildcard preferable

Credo che Josh lo affermi chiaramente:

In a public API, the [wildcard] is better because it’s simpler.

Cioè, per gli utenti dell'API. La piccola complessità aggiuntiva nell'implementazione non è visibile dall'esterno. E poiché l'implementazione viene scritta una sola volta, ma l'API può essere utilizzata molte volte da molte persone diverse, semplificare l'API a costo di rendere l'implementazione leggermente più complessa è comunque una vittoria generale.

> perché usarlo a tutti?

Vuoi dire, perché è meglio di

public static void swap(List list, int i, int j)

? Perché quest'ultimo perderebbe del tutto i generici, lasciando che il compilatore omettesse tutti i controlli di tipo generico e permettendoci di scrivere codice sciatto. Penso che sia meglio usare firme di tipo generico anche se sono generali, solo per mantenere l'abitudine.

Aggiornamento che riflette sul commento qui sotto

Hai dimenticato la dichiarazione generica dei parametri dalla seconda firma, correttamente dovrebbe essere

public static <E> void swap(List<E> list, int i, int j)

Cioè, <E> appare due volte, senza alcun beneficio aggiunto, contro <?> che appare solo una volta nella prima firma. Questo è il motivo per cui è più semplice.

    
risposta data 05.09.2011 - 00:01
fonte

Leggi altre domande sui tag