JAVA ΕΝΟΤΗΤΑ 10 – THE SWITCH STATEMENT

 


ΕΙΣΑΓΩΓΗ

Στο προηγούμενο δωρεάν μάθημα Java είδαμε πως μπορούμε να προσθέσουμε στο κώδικα μας την δυνατότητα να ακολουθεί διαφορετική ροή εκτέλεσης ανάλογα με το αποτέλεσμα κάποιας συνθήκης. 

Ο έλεγχος της συνθήκης ήταν το πρώτο βήμα σε μια σειρά από if-else ελέγχους που ακολουθούσαν.

Στο σημερινό δωρεάν μάθημα Java θα δούμε πως μπορούμε να ακολουθήσουμε μια παρόμοια λογική χρησιμοποιώντας το switch.

SWITCH SYNTAX AND EXPLANATION

Συντακτικά υπάρχουν αρκετές διαφορές ανάμεσα στο switch και στα if-else statements όμως και τα δύο συμφωνούν σε μια κοινή λογική ως προς τον τρόπο που θα αποφέρουν το επιθυμητό αποτέλεσμα.

Αν θυμάστε από την προηγούμενη ενότητα στα if-else statements κάναμε μια σειρά από ελέγχους και η πρώτη συνθήκη που θα μας έδινε true ήταν και εκείνη που θα όριζε την ροή εκτέλεσης του κώδικα μας.

Αν και θα δούμε πολύ αναλυτικά τη δομή και σύνταξη του switch, αξίζει να αναφέρουμε ότι η μεγαλύτερη διαφορά από τα if-else είναι ότι δεν μπορούμε να χρησιμοποιήσουμε relational operators (όπως =, <=, κτλ) στις συνθήκες.

Πάμε να δούμε πρώτα πως μοιάζει ένας java κώδικας που χρησιμοποιεί το switch και μετά θα εξηγήσουμε αναλυτικά το πώς δουλεύει.

App.java

package com.example;

public class App {

    public static void main(String[] args) {
        char grade = 'B';
        switch (grade) {
            case 'A':
                System.out.println("Excellent!");
                break;
            case 'B':
            case 'C':
                System.out.println("Well done");
                break;
            case 'D':
                System.out.println("You passed");
                break;
            case 'F':
                System.out.println("Better try again");
                break;
            default:
                System.out.println("Invalid grade");
                break;
        }
        System.out.println("Your grade is a " + grade);
    }

}

Output

Well done

Your grade is a B

Το πρόγραμμα μας ξεκινάει με την ανάθεση ενός χαρακτήρα σε μια μεταβλητή με το όνομα grade. Στην αμέσως επόμενη γραμμή κώδικα, ορίζουμε την αρχή ενός switch και μέσα στην παρένθεση περνάμε τη μεταβλητή την οποία το switch θα ελέγξει και ανάλογα με τη τιμή της θα εκτελέσει διαφορετικό κώδικα. Από την έκδοση java 7 και μετά το είδος της τιμής που δέχεται το switch μπορεί να είναι byte, short, int, char, enumeration ή String. Στο δικό μας παράδειγμα είναι char.

Η τιμή της μεταβλητής συγκρίνεται με κάθε ένα από τα cases που έχουμε ορίσει. Εάν η τιμή του case είναι ίδια με αυτή της μεταβλητής, τότε ο κώδικας που ακολουθεί μετά το colon ( : ) θα εκτελεστεί. Εάν κανένα από τα cases δεν επαληθευτούν, τότε θα ενεργοποιηθεί το default. Αν και η επιλογή default είναι προαιρετική, είναι best practice να το χρησιμοποιούμε έτσι ώστε πάντα το πρόγραμμα μας να επιλέγει κάποιο γκρουπ κώδικα να εκτελέσει ακόμα και αν κανένα από τα cases δεν επαληθεύεται.


 

Επίσης θα παρατηρήσατε ότι σε κάθε case, μετά το τέλος του κώδικα, υπάρχει και μια εντολή break. Η χρήση του break σταματάει την εκτέλεση του κώδικα σε εκείνο το σημείο και δεν προχωράει στο κώδικα που ανήκει στο επόμενο case. Αν δεν υπάρχει το break, τότε όλες οι γραμμές κώδικα από όλα τα επόμενα cases θα εκτελεστούν μέχρι να βρεθεί κάποιο break. Αν δεν υπάρχει κανένα break τότε όλος ο κώδικας θα εκτελεστεί συμπεριλαμβανομένου και του default. Ο λόγος που συμβαίνει αυτό είναι γιατί ο έλεγχος της μεταβλητής με το case γίνεται μόνο μια φορά. Για το πρώτο case που η σύγκριση θα επαληθευτεί, η java εκτελεί το κώδικα του συγκεκριμένου case και κάθε case που ακολουθεί μέχρι να βρει την εντολή break.

Αυτή την ιδιότητα του break μπορούμε να τη χρησιμοποιήσουμε προς όφελος μας. Για παράδειγμα, στο case B δεν υπάρχει break. Ο λόγος είναι απλός: Θέλουμε αν η μεταβλητή έχει τιμή B ή C να εκτελεστεί ο ίδιος κώδικας ο οποίος είναι “Well done”.

Ας δούμε ένα ακόμα πρόγραμμα στο οποίο χρησιμοποιούμε int τιμές στο switch. Παρατηρήστε ότι όταν συγκρίνουμε αριθμούς δεν χρησιμοποιούμε quotes.

App.java

package com.example;

public class App {

    public static void main(String[] args) {
        int floor = 3;
        switch (floor) {
            case 1:
                System.out.println("Going to the first floor");
                break;
            case 2:
                System.out.println("Going to the second floor");
            case 3:
                System.out.println("Going to the third floor");
                break;
            default:
                System.out.println("Going Floor Level");
                break;
        }
        System.out.println("You are in floor " + floor);
    }

}

Output

Going to the third floor

You are in floor 3

Τα δύο προηγούμενα προγράμματα ακολουθούν τον κλασικό τρόπο χρήσης του switch που στηρίζεται στο break για να εκτελεστεί ο κώδικας της εκάστοτε επιλογής και να συνεχιστεί η εκτέλεση του προγράμματος εκτός switch. Από τη Java 13 και μετά, το switch μπορεί να χρησιμοποιηθεί σαν statement που επιστρέφει τιμή σε μια μεταβλητή χρησιμοποιώντας την εντολή yield.

Ας δούμε πως θα μπορούσαμε να γράψουμε πάλι το πρώτο μας πρόγραμμα κάνοντας χρήση των καινοτομιών που προσφέρουν οι μοντέρνες εκδόσεις της Java.

App.java

package com.example;

public class App {

    public static void main(String[] args) {
        char grade = 'B';
        String message = switch (grade) {
            case 'A':
                yield "Excellent!";
            case 'B', 'C':
                yield "Well done";
            case 'D':
                yield "You passed";
            case 'F':
                yield "Better try again";
            default:
                yield "Invalid grade";
        };
        System.out.println("Your grade is a " + grade);
        System.out.println(message);
    }

}

Output

Your grade is a B

Well done

Υπάρχει ακόμα ένας πιο βελτιωμένος τρόπος που λιγοστεύει ακόμα περισσότερο τον κώδικα και αυτός είναι χρησιμοποιώντας expressions.

App.java

package com.example;

public class App {

    public static void main(String[] args) {
        char grade = 'B';
        switch (grade) {
            case 'A' -> System.out.println("Excellent!");
            case 'B', 'C' -> System.out.println("Well done");
            case 'D' -> System.out.println("You passed");
            case 'F' -> System.out.println("Better try again");
            default -> System.out.println("Invalid grade");
        }
        System.out.println("Your grade is a " + grade);
    }

}

Output

Well done

Your grade is a B

Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το blog να μεγαλώσει ακόμα πιο πολύ και να έχει περισσότερες δυνατότητες στην online παράδοση δωρεάν μαθημάτων.


full-width

Post a Comment

0 Comments