W poprzednim wpisie, zapoznaliśmy się ze strukturą programów pisanych w Javie, wiemy o co chodzi z pakietami oraz klasami i obiektami. W dzisiejszej lekcji poznamy podstawowe instrukcje sterujące w Javie czyli IF oraz SWITCH.

01. Instrukcja sterująca IF

IF jest prawdopodobnie najczęściej wykorzystywanym elementem Javy, szczególnie przez osoby które dopiero zaczynają swoją przygodę z programowaniem 😉 Dzieje się tak dlatego że, nie znając innych, lepszych możliwości, „w miarę prosty sposób” możemy zbudować program który będzie zachowywał się tak jak tego chcemy 😉 Wraz ze wzrostem doświadczenia nauczymy się jak odpowiednia wykorzystywać wzorce projektowe aby uniknąć tak zwanej „ifologi” 😊

Żeby nie było, każdy początkujący programista tworzy jakiegoś małego potwora który składa się z kilkudziesięciu IF’ów (lub kilkuset 😉), pamiętam jak na pierwszym roku studiów po stworzeniu gry w kółko i krzyżyk opartej na IF’ach postanowiłem w ten sam sposób zrobić grę w statki… to była dopiero masakra 😉

No dobrze, ale czas przejść do konkretów, IF wygląda tak:

if (warunek) {
    //Instrukcje które mają się wykonać po spełnieniu warunku
}

Składania jest bardzo intuicyjna, jeśli warunek został spełniony, zostaną wykonane wszystkie instrukcje znajdujące się w klamrach. IF posiada swoje rozwinięcie o instrukcję ELSE:

if (warunek) {
    //Instrukcje które mają się wykonać po spełnieniu warunku
} else {
    //Instrukcje które mają się wykonać jeśli warunek nie został spełniony
}

Instrukcje które znajdą się w bloku else, wykonają się tylko i wyłącznie wtedy gdy warunek nie został spełniony. Ciekawym mechanizmem jest możliwość łączenia else oraz if:

if (warunek) {
    //Instrukcje
} else if(innyWarunek) {
    //Instrukcje
} else if(kolejnyWarunek){
    //Instrukcje
} else {
    //Jeśli żaden warunek nie zostanie spełniony wykonaj te instrukcje
}

Przeanalizujmy sobie powyższy pseudo kod, w pierwszej linii sprawdzamy jakiś warunek, jeśli warunek ten zostanie spełniony wykonają się zawarte w jego bloku instrukcje i cały blok if zostanie zakończony. Jeśli jednak warunek nie zostanie spełniony przechodzimy do kolejnego sprawdzenia w else if(innyWarunek), tutaj mamy sytuacje analogiczną, jeśli warunek jest spełniony wykonają się instrukcję w danym bloku, jeśli nie przechodzimy dalej do sprawdzenia kolejnego else if (kolejnyWarunek). Jeśli żaden z warunków powyżej nie został spełniony wykonają się instrukcje z bloku else.

Przykład 😊 Tworzymy klasę  User:

public class User {

    private Integer id;
    private String userName;
    private String email;
    private int userAge;
    private boolean active;

    //Konstruktor...

    //Gettery dla pól...
}

Oraz klasę Validator która będzie posiadać jedną metodę sprawdzającą użytkownika:

public class Validator {

    public void validUser(User user){
        if (user.isActive() && user.getUserAge() >= 18) {
            System.out.println(user.getUserName()+" access granted!");
        } else {
            System.out.println(user.getUserName()+" access denied!");
        }
    }
}

Metoda ta sprawdza czy użytkownik jest aktywny oraz czy jego wiek jest większy lub równy 18

Teraz nasza metoda main może wyglądać tak:

public static void main(String[] args) {
        User userArek = new User(1, "Arek", "arkadiusz@technologicznasowa.pl", 30, true);
        User userKarol = new User(2, "Karol", "karol@email.pl", 20, false);
        User userAndrzej = new User(3, "Andrzej", "andrzej@email.pl", 17, true);

        Validator validator = new Validator();
        validator.validUser(userArek);
        validator.validUser(userKarol);
        validator.validUser(userAndrzej);
}

Wynikiem tego programu są wyświetlone napisy na konsolę:

Arek access granted!
Karol access denied!
Andrzej access denied!

Tylko jeden z użytkowników spełnił warunki walidacji, jego wiek był większy lub równy 18 oraz był aktywny. Zatem na konsoli dla użytkownika Arek został wyświetlony napis o przyznaniu dostępu. Pozostali użytkownicy nie spełnili niezbędnych wymogów użytkownik Karol posiadał flagę active ustawioną na false, natomiast użytkownik Andrzej nie posiadał wymaganego wieku.

02. Instrukcja sterująca switch

Instrukcja sterująca SWITCH w niektórych sytuacjach może nam idealnie zastąpić złożony blok if else if. Składnia SWITCH wygląda następująco:

switch (zmienna) {
    case wartosc1:
        //Instrukcje
        break;
    case wartosc2:
        //Instrukcje
        break;
    default:
        //Instrukcje
        break;
}

Sprawa wygląda bardzo podobnie jak w przypadku instrukcji if else if. Do naszej instrukcji sterującej switch wprowadzamy jakąś zmienną która będzie sprawdzana, jeśli jej wartość będzie równa którejś z wartości case, zostaną wykonane instrukcje w tym bloku, jeśli nie uda się dopasować do żadnej wartości case, zostanie wykonany blok default.

Należy zwrócić szczególną uwagę na instrukcję break, która znajduje się na końcu każdej instrukcji case oraz default. Instrukcja break powoduje przerwanie wykonywania instrukcji switch, gdyby jej zabrakło zostały by wykonane instrukcje znajdujące się w bloku case który został wywołany, oraz wszystkie bloki znajdujące się poniżej!

Dużo łatwiej jest zrozumieć to na przykładzie, dołóżmy do klasy Validator kolejną metodę:

public void checkUserName(String userName) {
    switch (userName) {
        case "Arek":
            System.out.println("Arek jest administratorem strony");
        case "Andrzej":
            System.out.println("Andrzej jest redaktorem strony");
        default:
            System.out.println("Nieznany uzytkownik");
    }
}

Zwróć uwagę na to iż nie użyłem instrukcji break! Teraz gdy wywołamy naszą metodą dla użytkownika userArek:

validator.checkUserName(userArek.getUserName());

Otrzymamy następujący wynik na konsoli:

Arek jest administratorem strony
Andrzej jest redaktorem strony
Nieznany uzytkownik

Na konsolę zostały wypisane wszystkie możliwości naszego switcha, dlaczego? Ponieważ tak jak wspomniałem wcześniej zabrakło instrukcji break. W naszym przykładzie do metody przesłaliśmy imię “Arek” które zostało dopasowane do pierwszej wartości case, jednak zabrakło instrukcji break, więc program przeszedł do wykonania kolejnego bloku case.

Poprawiona metoda wygląda następująco:

public void checkUserName(String userName) {
    switch (userName) {
        case "Arek":
            System.out.println("Arek jest administratorem strony");
            break;
        case "Andrzej":
            System.out.println("Andrzej jest redaktorem strony");
            break;
        default:
            System.out.println("Nieznany uzytkownik");
            break;
    }
}

Tym razem wszystko zadziałało zgodnie z planem!