[JAVA] Punkt 55: Optionen mit Bedacht zurückgeben
55. Seien Sie vorsichtig bei der Rücksendung Optional
- Vor Java7 gab es bei der Betrachtung von Methoden, die unter bestimmten Bedingungen keinen Wert zurückgeben konnten, keine andere Wahl, als eine Ausnahme auszulösen oder null zurückzugeben. Aus Java8 wurde die Option zur Rückgabe von Optional geboren.
package tryAny.effectiveJava;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
List<String> l1 = Arrays.asList("paper", "strong", "java", "pepper");
List<String> l2 = new ArrayList<>();
System.out.println(max(l1).get());
System.out.println(max(l2).orElse("no words"));
try {
max(l2).orElseThrow();
} catch (NoSuchElementException e) {
System.out.println(e.getMessage());
}
System.out.println(max(l1).filter(str -> str.length() == 6).map(str -> str.toUpperCase()).get());
}
public static <E extends Comparable<E>> Optional<E> max(Collection<E> c) {
if (c.isEmpty()) {
return Optional.empty();
}
E result = null;
for (E ele : c) {
if (result == null || ele.compareTo(result) > 0) {
result = Objects.requireNonNull(ele);
}
}
return Optional.of(result);
}
}
- Geben Sie keine Null von einer Methode zurück, für die Optional der Rückgabewert ist. Wenn Sie dies tun, macht es keinen Sinn, Optional einzuführen.
- Wenn Sie auswählen, ob Optional zurückgegeben werden soll, anstatt null zurückzugeben oder eine Ausnahme auszulösen, wählen Sie mit derselben Idee (Item71) aus, wie Sie entscheiden möchten, ob eine aktivierte Ausnahme ausgelöst werden soll.
- Sie sollten Optional nicht für etwas einschließen, in dem etwas wie eine Sammlung, eine Karte, ein Stream, ein Array oder Optional gespeichert ist. Zum Beispiel ist es besser, eine leere Liste zurückzugeben, als eine optionale <Liste > zurückzugeben. Dies liegt daran, dass, wenn eine leere Liste zurückgegeben werden kann, die Option "Optional" nicht zurückgegeben werden muss.
- Wenn Sie einen optionalen umschlossenen Wert als Rückgabewert der Methode auswählen sollten, kann das Ergebnis möglicherweise nicht zurückgegeben werden. Wenn das Ergebnis null ist, muss der Methodenaufrufer besonders berücksichtigt werden. Ist.
- Nicht zurückgeben Optional für int-, double- und long-Wrapper-Klassen. OptionalInt, OptionalDouble und OptionalLong sind verfügbar. Verwenden Sie sie daher.
- Verwenden Sie Optional nicht als Sammlung, Array-Schlüssel, Wert oder Element.
- Optional kann Optional als nicht wesentlicher Feldwert für eine Instanz verwendet werden. (Siehe die in Punkt 2 behandelte Klasse.)