Welche Spezifikation unterstützt optionale Parameter?
Antworten
Zu viele Anzeigen?Sie können eine Klasse verwenden, die ähnlich wie ein Builder funktioniert und Ihre optionalen Werte wie folgt enthält.
public class Options {
private String someString = "default value";
private int someInt= 0;
public Options setSomeString(String someString) {
this.someString = someString;
return this;
}
public Options setSomeInt(int someInt) {
this.someInt = someInt;
return this;
}
}
public static void foo(Consumer<Options> consumer) {
Options options = new Options();
consumer.accept(options);
System.out.println("someString = " + options.someString + ", someInt = " + options.someInt);
}
Verwenden Sie wie
foo(o -> o.setSomeString("something").setSomeInt(5));
Die Ausgabe ist
someString = something, someInt = 5
Um alle optionalen Werte auszulassen, müssten Sie es wie folgt aufrufen foo(o -> {});
oder, wenn Sie es vorziehen, können Sie eine zweite foo()
Methode, die die optionalen Parameter nicht akzeptiert.
Mit diesem Ansatz können Sie optionale Werte in beliebiger Reihenfolge angeben, ohne dass es zu Unklarheiten kommt. Anders als bei varargs können Sie auch Parameter verschiedener Klassen angeben. Dieser Ansatz wäre sogar noch besser, wenn Sie Anmerkungen und Codegenerierung verwenden könnten, um die Options-Klasse zu erstellen.
Wenn es sich um einen API-Endpunkt handelt, besteht eine elegante Möglichkeit darin, "Spring"-Anmerkungen zu verwenden:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false, defaultValue = "hello") String id) {
return innerFunc(id);
}
Beachten Sie in diesem Fall, dass die innerFunc die Variable benötigt, und da es sich nicht um einen Api-Endpunkt handelt, kann diese Spring-Annotation nicht verwendet werden, um sie optional zu machen. Referenz: https://www.baeldung.com/spring-request-param
Java unterstützt jetzt optionals in 1.8, ich bin mit der Programmierung auf Android stecken, so dass ich Nullen verwenden, bis ich den Code zu optionalen Typen verwenden refactor kann.
Object canBeNull() {
if (blah) {
return new Object();
} else {
return null;
}
}
Object optionalObject = canBeNull();
if (optionalObject != null) {
// new object returned
} else {
// no new object returned
}
Dies ist eine alte Frage, vielleicht sogar bevor die Option eingeführt wurde, aber heutzutage kann man einige Dinge berücksichtigen: - Methodenüberladung verwenden - Verwendung des Optional-Typs, der den Vorteil hat, dass NULLs nicht weitergegeben werden müssen Der optionale Typ wurde in Java 8 eingeführt, bevor er üblicherweise von Drittanbieter-Libs wie Googles Guava verwendet wurde. Die Verwendung von Optionalen als Parameter / Argumente kann als Überbeanspruchung angesehen werden, da der Hauptzweck darin bestand, sie als Rückgabezeitpunkt zu verwenden.
Ref: https://itcodehub.blogspot.com/2019/06/using-optional-type-in-java.html