5. Wielowariantowe wybory za pomocą instrukcji switch
Zamiast wielokrotnych if - else if w niektórych przypadkach można zastosować instrukcję wyboru wielowariantowego switch. Ma ona następującą ogólną postać switch (wyr) blok_switch gdzie:
Wyrażenie w nawiasach switch jest wyliczane, a jego wartość porównywana z
wartościami wyrażeń stałych (zawartych w częściach oznaczanych przez etykiety
case). Sterowanie jest przekazywane do tej instrukcji, którą poprzedza etykieta
case z wyrażeniem stałym równym co do wartości wyrażeniu w nawiasach switch. public class SimpleCalc { private double a; private double b; public SimpleCalc(double x, double y) { a = x; b = y; } public double makeOp(char op) { double r = 0; switch(op) { case '+' : r = a + b; break; case '-' : r = a - b; break; case '*' : r = a * b; break; case '/' : r = a / b; break; default : System.out.println("Nieznany kod operacji"); } return r; } } class SimplecalcTest { public static void main(String[] args) { SimpleCalc sc = new SimpleCalc(1.2, 3.7); System.out.println( sc.makeOp('+')); System.out.println( sc.makeOp('-')); System.out.println( sc.makeOp('*')); System.out.println( sc.makeOp('/')); } }
W metodzie makeOp wartość zmiennej op (typu char) steruje obliczeniami (np. jeśli
zawiera znak '+' to sterowanie jest przekazywane do miejsca oznaczonego etykietą
case '+', wartość r jest wyliczana jako suma a i b, a instrukcja break pozwala
opuścić dalsze instrukcje zawarte w bloku switch). Warto szczególnie podkreślić, że etykiety case są tworzone przez wyrażenia
stałe. Wyrażenie stałe to takie, którego wartość jest znana w fazie kompilacji
i nie może być zmieniona w fazie wykonania programu. Będzie to np. literał
(taki jak '+'. '*' czy 1), nazwa stałej (zadeklarowanej jako final), wyrażenie
składające się z literałów i nazw stałych połączonych operatorami języka
(np. LMAX + 3/LMIN, gdzie LMAX i LMIN - nazwy stałych). Wartość wyrażenia
stałego musi być typu całkowitego i dać się przekształcić do typu wyrażenia
w nawiasach switch.
Nie należy tez zapominać o umieszczeniu instrukcji we właściwym momencie
przerywających sekwencje operacji zawartych w bloku swicth.
Etykieta w programie jest identyfikatorem z następującym znakiem :. Nie
należy mylić ogólnego pojęcia etykiety ze specjalnym przypadkiem "etykiety"
case
Jeśli natomiast w instrukcji break podamy etykietę, to sterowanie może być przekazane z bloku switch do instrukcji wskazywanej przez tę etykietę. W ten sposób za pomocą break możemy wychodzić z głęboko zagnieżdżonych bloków switch. Uwaga: stosowanie etykiet w instrukcji break dla wychodzenia z zagnieżdżonych bloków dotyczy rózwnież instrukcji sterujących for, while i do_while. Stosowanie etykiet podlega pewnym ograniczeniom - zob. opis języka na stronie sun.java,com.
|