Jak korzystać z opcjonalnych parametrów w Javie? Jaka specyfikacja obsługuje parametry opcjonalne?
java
optional-parameters
Mike Pone
źródło
źródło
Istnieje kilka sposobów symulacji opcjonalnych parametrów w Javie:
Przeciążenie metody.
Jednym z ograniczeń tego podejścia jest to, że nie działa, jeśli masz dwa opcjonalne parametry tego samego typu, a każdy z nich można pominąć.
Varargs.
a) Wszystkie parametry opcjonalne są tego samego typu:
b) Rodzaje parametrów opcjonalnych mogą być różne:
Główną wadą tego podejścia jest to, że jeśli parametry opcjonalne są różnych typów, tracisz sprawdzanie typu statycznego. Ponadto, jeśli każdy parametr ma inne znaczenie, potrzebujesz jakiegoś sposobu na ich rozróżnienie.
Zero Aby rozwiązać ograniczenia poprzednich podejść, możesz zezwolić na wartości zerowe, a następnie przeanalizować każdy parametr w treści metody:
Teraz należy podać wszystkie wartości argumentów, ale wartości domyślne mogą być zerowe.
Klasa fakultatywna To podejście jest podobne do wartości zerowych, ale wykorzystuje klasę opcjonalną Java 8 dla parametrów o wartości domyślnej:
Opcjonalne sprawia, że metoda dzwoniąca jest jawna dla osoby dzwoniącej, jednak taki podpis może okazać się zbyt szczegółowy.
Aktualizacja: Java 8 zawiera klasę
java.util.Optional
gotową do użycia, więc nie ma potrzeby używania guava z tego konkretnego powodu w Javie 8. Nazwa metody jest jednak nieco inna.Wzór konstruktora. Wzorzec konstruktora jest używany dla konstruktorów i jest implementowany przez wprowadzenie oddzielnej klasy konstruktora:
Mapy Gdy liczba parametrów jest zbyt duża i dla większości wartości domyślnych są zwykle używane, możesz przekazać argumenty metody jako mapę ich nazw / wartości:
W Javie 9 takie podejście stało się łatwiejsze:
Pamiętaj, że możesz połączyć dowolne z tych podejść, aby osiągnąć pożądany rezultat.
źródło
a
zmienna jest ciągiem (rzutowanie jest poprawne).Optional
jako parametru w jednej z opcji, ta odpowiedź jest bardzo dobra.Istnieją opcjonalne parametry w Javie 5.0. Po prostu zadeklaruj swoją funkcję w ten sposób:
możesz zadzwonić z
doSomething();
lubdoSomething(true);
teraz.źródło
doSomething() { doSomething(true); }
nie ma tablic do czynienia, nie ma dwuznacznościMożesz użyć czegoś takiego:
params
Zmienna jest opcjonalna. Jest traktowany jako zerowalna tablica obiektów.O dziwo, nie mogłem nic na ten temat znaleźć w dokumentacji, ale działa!
Jest to „nowe” w Javie 1.5 i nowszych wersjach (nie obsługiwane w Javie 1.4 lub wcześniejszych).
Widzę, że użytkownik bhoot wspomniał o tym również poniżej.
źródło
Niestety Java nie obsługuje bezpośrednio parametrów domyślnych.
Jednak napisałem zestaw adnotacji JavaBean, a jeden z nich obsługuje domyślne parametry, takie jak:
Procesor adnotacji generuje przeciążenia metody, aby odpowiednio to obsługiwać.
Zobacz http://code.google.com/p/javadude/wiki/Annotacje
Pełny przykład na http://code.google.com/p/javadude/wiki/AnnotationsDefaultParametersExample
źródło
W Javie nie ma opcjonalnych parametrów. Możesz przeciążyć funkcje, a następnie przekazać wartości domyślne.
źródło
Wspomniano o VarArgs i przeciążeniu. Inną opcją jest wzorzec konstruktora, który wyglądałby mniej więcej tak:
Chociaż ten wzorzec byłby najbardziej odpowiedni, gdy potrzebujesz opcjonalnych parametrów w konstruktorze.
źródło
W JDK> 1.5 możesz używać tego w ten sposób;
źródło
Możesz to zrobić za pomocą metody przeciążania w ten sposób.
Możesz także użyć adnotacji @Nullable
wystarczy przekazać null jako pierwszy parametr.
Jeśli przekazujesz zmienną tego samego typu, możesz jej użyć
źródło
Krótka wersja :
Za pomocą trzech kropek :
(na podstawie odpowiedzi @ VitaliiFedorenko)
źródło
Przeładowanie jest w porządku, ale jeśli istnieje wiele zmiennych, które wymagają wartości domyślnej, otrzymasz:
Sugerowałbym więc użycie argumentu zmiennych dostarczanego przez Javę. Oto link do wyjaśnienia.
źródło
Możesz użyć klasy, która działa podobnie jak konstruktor, aby zawierać opcjonalne wartości w ten sposób.
Użyj jak
Dane wyjściowe to
Aby pominąć wszystkie opcjonalne wartości, które trzeba by tak nazwać
foo(o -> {});
lub, jeśli wolisz, możesz utworzyć drugąfoo()
metodę, która nie przyjmuje parametrów opcjonalnych.Korzystając z tego podejścia, możesz określić opcjonalne wartości w dowolnej kolejności bez żadnych dwuznaczności. Możesz także mieć parametry różnych klas w przeciwieństwie do varargs. Takie podejście byłoby jeszcze lepsze, gdyby można użyć adnotacji i generowania kodu do utworzenia klasy Options.
źródło
Java obsługuje teraz opcjonalne wersje 1.8, utknąłem w programowaniu na Androidzie, więc używam zer, dopóki nie będę mógł przefakturować kodu, aby użyć opcjonalnych typów.
źródło
Domyślnych argumentów nie można używać w Javie. Gdzie w C #, C ++ i Python, możemy ich użyć ..
W Javie musimy użyć 2 metod (funkcji) zamiast jednej z domyślnymi parametrami.
Przykład:
http://parvindersingh.webs.com/apps/forums/topics/show/8856498-java-how-to-set-default-parameters-values-like-c-
źródło
Jest to stare pytanie, być może jeszcze przed wprowadzeniem rzeczywistego typu Opcjonalnego, ale obecnie można rozważyć kilka rzeczy: - użycie przeciążenia metody - użycie Typu opcjonalnego, który ma tę zaletę, że pozwala uniknąć przepuszczania wartości NULL w okolicy Opcjonalny typ został wprowadzony w Javie 8 przed jego użyciem z lib stron trzecich, takich jak Google Guava. Używanie opcjonalnych jako parametrów / argumentów można uznać za nadmierne wykorzystanie, ponieważ głównym celem było wykorzystanie go jako czasu powrotu.
Ref: https://itcodehub.blogspot.com/2019/06/using-optional-type-in-java.html
źródło
Możemy ustawić opcjonalny parametr przez przeciążenie metody lub użycie DataType ...
| * | Przeciążenie metody:
Najłatwiej jest
| * | Typ danych ... może być parametrem opcjonalnym
źródło
RetDtaTyp
... poważnie? CzyRetDataType
zbyt trudno jest napisać?Jeśli planujesz użyć interfejsu z wieloma parametrami , możesz użyć następującego wzoru strukturalnego i zastosować lub zastąpić - metodę opartą na twoich wymaganiach .
źródło
Jeśli jest to punkt końcowy interfejsu API, eleganckim sposobem jest użycie adnotacji „Spring”:
Zauważ, że w tym przypadku innerFunc będzie wymagało zmiennej, a ponieważ nie jest to punkt końcowy interfejsu API, nie można użyć tej adnotacji z wiosny, aby uczynić ją opcjonalną. Odniesienie: https://www.baeldung.com/spring-request-param
źródło