Uso del parametro di tipo (o non)

6

Java efficace offre 2 modi per implementare swap :

// Two possible declarations for the swap method 
public static <E> void swap(List<E> list, int i, int j); 
public static void swap(List<?> list, int i, int j);

Quindi, Mr. Bloch dice:

Which of these two declarations is preferable, and why? In a public API, the second is better because it's simpler. You pass in a list—any list—and the method swaps the indexed elements. There is no type parameter to worry about. As a rule, if a type parameter appears only once in a method declaration, replace it with a wildcard.

Sembra che sia possibile utilizzare swapNoWildCard anziché il metodo swap e swapHelper . Mr. Bloch spiega il ragionamento per usare la seconda firma sopra.

public static <E> void swapNoWildcard(List<E> list, int i, int j) {
    E e = list.set(j, list.get(i));
    list.set(i, e);
}

public static void swap(List<?> list, int i, int j) {
    swapHelper(list, i, j);
}

private static <E> void swapHelper(List<E> list, int i, int j) {
    E e = list.set(j, list.get(i));
    list.set(i, e);
}

Tuttavia, questo è discutibile dato che swapNoWildCard è quasi la metà del numero di righe di codice rispetto all'implementazione degli altri 2 metodi?

Perché è così utile non specificare il parametro type?

    
posta Kevin Meredith 19.02.2014 - 22:19
fonte

1 risposta

4

In un buon software design ciò che vuoi, o meglio ancora in un mondo idealizzato, devi avere un'interfaccia che comunichi l'intento. Togliendo il parametro di tipo List ha espresso chiaramente questo intento. Stai dicendo al chiamante "Mi interessa solo agire su un List e nient'altro". Questo è il motivo per cui il secondo è migliore del primo.

Per inciso, la ragione per cui il secondo metodo richiede due chiamate di funzione è che Java non ha inferenza di tipo, quindi sei costretto a dichiarare un E per acquisire uno dei valori scambiati.

    
risposta data 21.02.2014 - 14:56
fonte

Leggi altre domande sui tag