Próbuję tylko dowiedzieć się, jak użyć wielu wielokrotnych przypadków dla instrukcji przełącznika Java. Oto przykład tego, co próbuję zrobić:
switch (variable)
{
case 5..100:
doSomething();
break;
}
w porównaniu z koniecznością:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
Jakieś pomysły, jeśli to możliwe, lub jaka jest dobra alternatywa?
java
syntax
switch-statement
FunJavaCode
źródło
źródło
Odpowiedzi:
Niestety w Javie nie jest to możliwe. Będziesz musiał uciekać się do używania
if-else
oświadczeń.źródło
if/elseif/else
stwierdzeń, niezależnie od języka.Druga opcja jest całkowicie w porządku. Nie jestem pewien, dlaczego ankietowany powiedział, że to niemożliwe. To jest w porządku i robię to cały czas:
źródło
Na zewnątrz:
Src: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
źródło
Może nie tak eleganckie, jak niektóre poprzednie odpowiedzi, ale jeśli chcesz uzyskać przełączniki z kilkoma dużymi zakresami, po prostu połącz wcześniej zakresy w jeden przypadek:
źródło
case 1
to oznaczavariable == 1
, co na dłuższą metę prowadzi do nieporozumień i wielu problemów. Jeśli potrzebujesz umieścić komentarze w swoim kodzie, aby był czytelny, oznacza to, że zrobiłeś coś złego IMHO.Jedną z opcji zorientowanych obiektowo do zastąpienia zbyt dużych
switch
iif/else
konstrukcji jest użycieChain of Responsibility Pattern
do modelowania procesu podejmowania decyzji.Wzór łańcucha odpowiedzialności
Oto przykładowa implementacja, która jest również bezpieczna typu przy użyciu typów ogólnych.
To tylko szybki człowiek ze słomki, który przygotowałem w kilka minut, bardziej wyrafinowana implementacja może pozwolić na
Command Pattern
wstrzyknięcie jakiegoś rodzajuCase
instancji implementacji, aby uczynić go bardziej stylem wywołania zwrotnego IoC.Kiedyś fajną rzeczą w tym podejściu jest to, że instrukcje Switch / Case dotyczą tylko efektów ubocznych, co zawiera efekty uboczne w klasach, dzięki czemu można nimi zarządzać i lepiej ponownie używać, kończy się bardziej jak dopasowywanie wzorców w języku funkcjonalnym i to nie jest złe.
Będę publikować wszelkie aktualizacje lub ulepszenia tego streszczenia na Github.
źródło
Zgodnie z tym pytaniem jest to całkowicie możliwe.
Po prostu zbierz wszystkie przypadki, które zawierają tę samą logikę, i nie stawiaj
break
za nimi.To dlatego, że
case
bezbreak
przeskoczy do innegocase
dobreak
lubreturn
.EDYTOWAĆ:
Odpowiadając na komentarz, jeśli naprawdę mamy 95 wartości z tą samą logiką, ale o wiele mniejszą liczbę przypadków z inną logiką, możemy zrobić:
Jeśli potrzebujesz lepszej kontroli,
if-else
to wybór.źródło
case
instrukcji!). Obawiam się, że zgadzam się z zaakceptowaną odpowiedzią.Gruntownie:
Jeśli naprawdę potrzebujesz użyć przełącznika, to dlatego, że musisz robić różne rzeczy dla określonych zakresów. W takim przypadku tak, będziesz mieć niechlujny kod, ponieważ sprawy stają się skomplikowane i tylko rzeczy, które podążają za wzorcami, będą dobrze kompresowane.
Jedynym powodem zmiany jest oszczędność na wpisywaniu nazwy zmiennej, jeśli testujesz tylko wartości liczbowe przełączania. Nie włączysz 100 rzeczy i nie wszystkie będą robić to samo. To brzmi bardziej jak fragment „jeśli”.
źródło
// Przykład niezgodnego kodu
// Zgodne rozwiązanie
źródło
Od ostatniego wydania java-12 wiele stałych w tej samej etykiecie przypadku jest dostępnych w wersji zapoznawczej języka
To wygląda jak:
Zobacz więcej JEP 325: Przełącz wyrażenia (zapowiedź)
źródło
Jest to możliwe przy użyciu biblioteki Vavr
Jest to oczywiście tylko niewielka poprawa, ponieważ wszystkie przypadki nadal muszą być wyraźnie wymienione. Ale łatwo jest zdefiniować predykat niestandardowy:
Dopasowanie jest wyrażeniem, więc tutaj zwraca coś w rodzaju
Runnable
instancji zamiast bezpośredniego wywoływania metod. Po wykonaniu meczuRunnable
może zostać wykonany.Więcej informacji można znaleźć w oficjalnej dokumentacji .
źródło
alternatywnie możesz użyć jak poniżej:
lub poniższy kod również działa
źródło
JEP 354: Switch Expressions (Preview) in JDK-13 i JEP 361: Switch Expressions (Standard) w JDK-14 rozszerzy instrukcję switch, dzięki czemu może być używana jako wyrażenie .
Teraz możesz:
case L ->
):Przykład wyrażenia przełącznika:
źródło
Alternatywą zamiast używania wartości zakodowanych na stałe może być użycie mapowania zakresu w instrukcji switch:
źródło