[JAVA] Punkt 30: Favar generische Methoden

30. Wählen Sie eine generische Methode

// Uses raw types - unacceptable! (Item 26)
public static Set union(Set s1, Set s2) {
    Set result = new HashSet(s1);
    result.addAll(s2);
    return result;
}

Um die Warnung zu entfernen und typsicher zu machen, schreiben Sie den Typparameter wie folgt zwischen den Methodenmodifikator und den Rückgabewert der Methode.

// Generic method
public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
    Set<E> result = new HashSet<>(s1);
    result.addAll(s2);
    return result;
}
package tryAny.effectiveJava;

import java.util.function.UnaryOperator;

public class GenericsTest7 {
    public static void main(String[] args) {
        String[] strings = { "jute", "hemp", "nylon" };
        UnaryOperator<String> sameString = identityFunction();
        for (String s : strings)
            System.out.println(sameString.apply(s));
        Number[] numbers = { 1, 2.0, 3L };
        UnaryOperator<Number> sameNumber = identityFunction();
        for (Number n : numbers)
            System.out.println(sameNumber.apply(n));

    }

    // Generic singleton factory pattern
    private static UnaryOperator<Object> IDENTITY_FN = (t) -> t;

    @SuppressWarnings("unchecked")
    public static <T> UnaryOperator<T> identityFunction() {
        return (UnaryOperator<T>) IDENTITY_FN;
    }

}
public interface Comparable<T> {
    int compareTo(T o);
}
// Using a recursive type bound to express mutual comparability
public static <E extends Comparable<E>> E max(Collection<E> c);

<e extends comparable<e>>Repräsentiert "jedes Element e vergleichbar mit sich selbst". Das Folgende ist die Max-Methode unter Verwendung rekursiver Grenzen.

package tryAny.effectiveJava;

import java.util.Collection;
import java.util.Objects;

public class GenericsTest8 {
    // Returns max value in a collection - uses recursive type bound
    public static <E extends Comparable<E>> E max(Collection<E> c) {
        if (c.isEmpty())
            throw new IllegalArgumentException("Empty collection");
        E result = null;
        for (E e : c)
            if (result == null || e.compareTo(result) > 0)
                result = Objects.requireNonNull(e);
        return result;
    }

}

Die obige Methode löst eine IllegalArgumentException aus, wenn die Liste leer ist. Eine gute Alternative ist ein Rückgabewert von `Optional <E>`.

Recommended Posts

Punkt 30: Favar generische Methoden
Punkt 29: Generische Typen bevorzugen
Punkt 66: Verwenden Sie native Methoden mit Bedacht
Punkt 88: ReadObject-Methoden defensiv schreiben