JAVA ΕΝΟΤΗΤΑ 27 – THIS IN A CONSTRUCTOR

 



Δωρεάν μαθήματα Java

ΕΙΣΑΓΩΓΗ

Στο σημερινό δωρεάν μάθημα Java θα δούμε ποια είναι η δεύτερη χρήση του this και πως αυτή συνδυάζεται με τους constructors.

Είχαμε ήδη αναλύσει σε προηγούμενη ενότητα γιατί και πως χρησιμοποιούμε το this μέσα σε μια μέθοδο ή έναν constructor για να καλέσουμε instance variables. Όμως η χρήση του this δεν περιορίζεται μόνο σε αυτό. Υπάρχει μια επιπλέον δυνατότητα που μας επιτρέπει να καλέσουμε έναν constructor από έναν άλλο constructor.

COMMON USE OF THIS

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

SeatReservation.java

package com.example;

public class SeatReservation {
    public String seat;
    public int row;

    public SeatReservation() {
        System.out.println("Inside no-arg constructor");
        this.seat = "C";
        this.row = 4;
    }

    public SeatReservation(String seat) {
        System.out.println("Inside one-arg constructor");
        this.seat = seat;
        this.row = 4;
    }

    public SeatReservation(String seat, int row) {
        System.out.println("Inside two-arg constructor");
        this.seat = seat;
        this.row = row;
    }
}


Αυτή η απλή μορφή κλάσης μπορεί να είναι μέλος μιας μεγαλύτερης εφαρμογής reservation αεροπορικών εισιτηρίων. Η κλάση προσφέρει τρεις διαφορετικούς constructors μέσα από τους οποίους μπορούμε να δημιουργήσουμε τα αντικείμενα μας. Αυτό όμως που ζητάμε από τους constructors, ανεξάρτητα ποιον θα διαλέξει ο χρήστης για να δημιουργήσει το αντικείμενο, είναι να δώσουμε κάποιες αρχικές τιμές ακόμα και όταν καλέσουμε τον no-argument constructor. Αργότερα θα μπορούσαμε να κάνουμε έναν έλεγχο αν η θέση είναι ήδη reserved, αλλά ας κρατήσουμε τον κώδικα μας σε απλά επίπεδα.

Αυτό που παρατηρούμε σχεδόν αμέσως, είναι ότι ο κώδικας στους constructors επαναλαμβάνεται τρεις φορές. Εάν για κάποιο λόγο χρειαστεί να κάνουμε κάποια αλλαγή, θα πρέπει να αλλάξουμε και τους τρεις constructors. Αυτή η προσέγγιση δεν είναι και τόσο επιθυμητή γιατί σίγουρα περιλαμβάνει ένα μεγάλο ρίσκο λάθους.

CALLING A CONSTRUCTOR WITH THIS

Για να αποφύγουμε λοιπόν αυτή την επανάληψη στον κώδικα, μπορούμε να δημιουργήσουμε έναν constructor που έχει όλες τις λεπτομέρειες που χρειαζόμαστε και όλοι οι υπόλοιποι constructors της κλάση να καλούν αυτόν. Για να καλέσει λοιπόν ένας constructor έναν άλλο constructor χρησιμοποιούμε την λέξη this. Ο compiler της java απαιτεί όμως η χρήση του this μέσα σε έναν constructor να είναι η πρώτη γραμμή του κώδικα του. Εάν δεν είναι, τότε θα έχουμε compiler error.

Ας δούμε λοιπόν πως θα μπορούσαμε να αλλάξουμε τον κώδικα της προηγούμενης κλάσης έτσι ώστε να χρησιμοποιεί το this για να καλέσει ένας constructor έναν άλλον constructor μέσα στην ίδια κλάση.

SeatReservation.java

package com.example;

public class SeatReservation {
    public String seat;
    public int row;

    public SeatReservation() {
        this("C", 4);
        System.out.println("Inside no-arg constructor");
    }

    public SeatReservation(String seat) {
        this(seat, 4);
        System.out.println("Inside one-arg constructor");
    }

    public SeatReservation(String seat, int row) {
        System.out.println("Inside two-arg constructor");
        this.seat = seat;
        this.row = row;
    }
}


Όπως βλέπεται η λογική είναι πάρα πολύ απλή. Αν ο προγραμματιστής καλέσει τον no-argument constructor για να δημιουργήσει έναν αντικείμενο, ο no-argument constructor θα καλέσει εκείνον τον constructor που δέχεται δύο τιμές (δηλαδή τον τρίτο) και θα του περάσει τις δύο τιμές μέσα στην παρένθεση. Αν πάλι καλέσει τον δεύτερο constructor, εκείνος πάλι θα καλέσει τον τρίτο, περνώντας του δύο τιμές – μια που δέχτηκε από τον χρήστη και μια σταθερή από τον κώδικα. Τέλος ο τρίτος constructor είναι στην ουσία εκείνος που κάνει όλη την δουλειά. Αν το καλέσουμε θα χρειαστεί δύο τιμές για να δημιουργήσει το αντικείμενο.

Ας δούμε και την κλάση μέσα από την οποία δημιουργούμε αυτά τα αντικείμενα.

ReservationDemo.java

package com.example;

public class ReservationDemo {
    public static void main(String[] args) {
        System.out.println("Instantiating first Seat Reservation");
        SeatReservation seat1 = new SeatReservation();
        System.out.println(seat1.row + " " + seat1.seat);
        System.out.println("Instantiating second Seat Reservation");
        SeatReservation seat2 = new SeatReservation("B");
        System.out.println(seat2.row + " " + seat2.seat);
        System.out.println("Instantiating third Seat Reservation");
        SeatReservation seat3 = new SeatReservation("D", 23);
        System.out.println(seat3.row + " " + seat3.seat);
    }
}

Output

Instantiating first Seat Reservation

Inside two-arg constructor

Inside no-arg constructor

4 C

Instantiating second Seat Reservation

Inside two-arg constructor

Inside one-arg constructor

4 B

Instantiating third Seat Reservation

Inside two-arg constructor

23 D

Από το αποτέλεσμα που βλέπουμε μετά το πέρας εκτέλεσης του προγράμματος επιβεβαιώνεται η θεωρία μας. Ας αναλύσουμε τι ακριβώς γίνεται όταν καλέσουμε τον no-argument constructor. Όταν λοιπόν πάμε να δημιουργήσουμε ένα αντικείμενο καλώντας τον no-argument constructor, η java θα πάει στην κλάση και μετά στον συγκεκριμένο constructor για να εκτελέσει τον κώδικα του. Η πρώτη γραμμή όμως είναι το this("C", 4); που σημαίνει ότι καλεί τον τρίτο constructor - δηλαδή εκείνον που δέχεται δύο τιμές. Τώρα η java μεταφέρεται στον τρίτο constructor και εκτελεί τον κώδικα του. Αυτό άλλωστε φαίνεται από το μήνυμα Inside two-arg constructor. Όταν ολοκληρωθεί ο κώδικας του τρίτου constructor, ο έλεγχος του προγράμματος επιστρέφει πίσω στον no-argument constructor γιατί η εκτέλεση αυτού του κώδικα ακόμα δεν έχει ολοκληρωθεί. Ολοκληρώνεται με το μήνυμα Inside no-arg constructor.

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

full-width

Post a Comment

0 Comments