ΕΙΣΑΓΩΓΗ
Στο σημερινό δωρεάν μάθημα Java, θα μιλήσουμε για τους constructors. Πιο συγκεκριμένα, θα αναλύσουμε τον τρόπο με τον οποίο λειτουργούν σε μια κλάση για να μας βοηθήσουν με την δημιουργία αντικειμένων, όπως και πως μπορούμε να δημιουργήσουμε τους δικούς μας constructors δημιουργώντας αντικείμενα με αρχικές τιμές. Τέλος, θα δούμε πως είναι εφικτό να ορίσουμε πολλαπλούς constructors μέσα στην ίδια κλάση.
OUR BASIC BANK ACCOUNT EXAMPLE
Για να μπορέσουμε καλύτερα να αναπτύξουμε την θεωρία μας, θα χρησιμοποιήσουμε ένα παράδειγμα που αναφέρεται σε τραπεζικούς λογαριασμούς. Όπως σε κάθε πρόγραμμα Java, έτσι και εδώ θα ξεκινήσουμε δημιουργώντας μια κλάση με το όνομα Account. Αφού γράψετε πρώτα τον παρακάτω κώδικα αμέσως μετά θα δώσουμε και μια γρήγορη περιγραφή.
Account.java
Η θεωρία της παραπάνω κλάσης Account θα πρέπει να σας είναι ήδη γνωστή. Περιέχει δύο private instant μεταβλητές - name και balance. Τις έχουμε ορίσει σαν private έτσι ώστε να μην μπορεί κάποιος άμεσα να τις χρησιμοποιήσει και να επηρεάσει τις τιμές τους, αλλά μόνο δια μέσω getter και setter μεθόδων. Στο συγκεκριμένο παράδειγμα για λόγους ευκολίας, δεν έχουμε προσθέσει κάποιο if-else statement μέσα στις setter μεθόδους για έλεγχο τιμών πριν την ανάθεση τους στις μεταβλητές. Θα μπορούσαμε όμως αφού αυτός είναι και ο κύριος λόγος ύπαρξής τους στη Java.
Τώρα ας δημιουργήσουμε την κλάση MyAccount μέσα στην οποία θα παράγουμε αντικείμενα είδος Account.
MyAccount.java
Output
Michail balance: 2000.0 Euro
John balance: 1000.0 Euro
Στην κλάση MyAccount ακολουθήσαμε την θεωρία όπως την ξέρουμε μέχρι τώρα, δηλαδή δημιουργήσαμε δύο αντικείμενα (account1 και account2) καλώντας το default constructor (ή no-argumenta constructor) και μετά καλέσαμε τις μεταβλητές στο εκάστοτε αντικείμενο για να τους αναθέσουμε τιμές.
CREATING OUR OWN CONSTRUCTOR
Όπως ήδη γνωρίζουμε, από την στιγμή που έχουμε δημιουργήσει μια δική μας κλάση (πχ. Account), η Java μας προσφέρει έναν μηχανισμό που ονομάζεται constructor για να έχουμε την δυνατότητα να δημιουργήσουμε αντικείμενα από την συγκεκριμένη κλάση. Αν και αυτός ο μηχανισμός είναι άκρως απαραίτητος για την δημιουργία αντικειμένων, εμείς θα ζητούσαμε κάτι παραπάνω. Αντί να δημιουργούμε πρώτα τα αντικείμενα και μετά να τους θέτουμε τις τιμές τους, θα επιθυμούσαμε να θέτουμε τις τιμές των μεταβλητών τη στιγμή που δημιουργούμε τα αντικείμενα. Με αυτό τον τρόπο, και όταν δημιουργηθεί το αντικείμενο, οι μεταβλητές του θα έχουν τις επιθυμητές τιμές. Αυτό η Java μας επιτρέπει να το πραγματοποιήσουμε γράφοντας τους δικούς μας constructors.
Πριν γράψουμε όμως τον δικό μας constructor μέσα σε μια κλάση, θα πρέπει να θυμόμαστε δύο απλούς κανόνες που τους χαρακτηρίζουν και στην ουσία τους κάνουν να διαφέρουν από τις μεθόδους
- Ο constructor πάντα έχει το ίδιο όνομα με την κλάση
- Δεν υπάρχει return type στον constructor ούτε καν το void
Έχοντας αυτούς τους δύο απλούς κανόνες υπόψιν, ας δημιουργήσουμε τον δικό μας constructor στην κλάση Account και ας δούμε πως αυτό επηρεάζει την MyAccount κλάση.
Account.java
Ο καινούργιος constructor, που προσθέσαμε στην κλάση Account, δέχεται τιμές για δύο μεταβλητές – την name και την balance. Αυτό σημαίνει, όταν πάμε να δημιουργήσουμε το αντικείμενο μας, αν δεν δώσουμε τις δύο αυτές τιμές στον constructor δεν θα προχωρήσει στην δημιουργία του αντικειμένου. Επίσης παρατηρήστε ότι ενώ μοιάζει σαν μέθοδο, στην ουσία δεν είναι γιατί έχει το ίδιο όνομα με την κλάση και δεν έχει οριστεί return type στο signature του constructor.
Μέσα τώρα στον constructor μπορούμε να γράψουμε κώδικα ελέγχου για οτιδήποτε θέλουμε. Στο δικό μας παράδειγμα, δεν κάνουμε κανένα έλεγχο για το name και αυτό που δεχόμαστε το περνάμε σαν επίσημη τιμή του αντικειμένου. Στην περίπτωση του balance όμως, πριν αναθέσουμε την τιμή στην instance μεταβλητή balance του αντικειμένου, απαιτούμε η τιμή που μας δίνεται να είναι θετική. Επίσης έχουμε αφαιρέσει την setBalance( ) μέθοδο γιατί θέλουμε το balance να οριστεί την στιγμή που θα δημιουργηθεί το αντικείμενο δια μέσω του constructor και η τιμή του να αλλάζει μόνο όταν καλέσουμε την μέθοδο deposit( ). Η μέθοδο deposit( ) δέχεται μια double τιμή, που πρέπει να είναι θετική, και προσθέτει το χρηματικό ποσόν σε αυτό που υπάρχει ήδη στην balance μεταβλητή.
Ας δούμε τώρα πόσο έχει αλλάξει ο κώδικας στην MyAccount κλάση.
MyAccount.java
Output
Michail balance: 2000.0 Euro
John balance: 1150.0 Euro
Σε αυτό το σημείο θα παρατηρήσουμε μια μεγάλη διαφορά από την προηγούμενη έκδοση της κλάσης. Όταν πάμε να δημιουργήσουμε το αντικείμενο καλώντας τον constructor με την λέξη new, διαθέσιμος είναι μόνο ο καινούργιος constructor που δημιουργήσαμε. Αυτή είναι η μόνη μας επιλογή. Ο απλός constructor (ή no-argument constructor όπως ονομάζεται) δεν υπάρχει πια.
Η Java, από την στιγμή που πήραμε την πρωτοβουλία να δημιουργήσουμε έναν δικό μας constructor, αποσύρει τον δικό της no-argument και δεν τον έχουμε πια σαν διαθέσιμη επιλογή. Φυσικά μπορούμε να τον προσθέσουμε πίσω και θα το δούμε αυτό σε λίγο αλλά αυτό που μας αφορά τώρα είναι ότι η μόνη επιλογή που έχουμε είναι να δημιουργήσουμε ένα αντικείμενο με κάποιες αρχικές τιμές.
Αφού δημιουργήσουμε δύο αντικείμενα μπορούμε, αν επιθυμούμε, να καλέσουμε και την deposit( ) μέθοδο για να προσθέσουμε χρήματα στον ήδη υπάρχοντα λογαριασμό. Και βασικά αυτό κάνουμε για το account2. Αυτός άλλωστε είναι και ο λόγος που αφαιρέσαμε την setBalance( ) από την κλάση Account γιατί θέλαμε να μην μπορεί κάποιος να διαφοροποιήσει το balance του λογαριασμού εκτός και αν κάνει επίσημα deposit. Οι τελικές γραμμές κώδικα της MyAccount απλά τυπώνουν στην οθόνη τις πληροφορίες του κάθε account.
CREATING MULTIPLE CONSTRUCTORS
Τώρα η βασική ερώτηση είναι - μπορούμε να έχουμε περισσότερες από μια επιλογή για την δημιουργία αντικειμένων? Φυσικά και μπορούμε, αν δημιουργήσουμε πολλαπλούς constructor στην κλάση Account. Μα πως είναι δυνατόν να έχουμε πολλαπλούς constructor στην ίδια κλάση αφού όλοι οι constructor έχουν το ίδιο όνομα με την κλάση? Μα φυσικά με την λογική του overloading. Κάθε constructor θα έχει διαφορετικό αριθμό και data type μεταβλητών στο signature του. Η θεωρία είναι ακριβώς η ίδια όπως την μάθαμε όταν καλύψαμε σε προηγούμενο δωρεάν μάθημα Java το overloading στις μεθόδους. Ας πάμε λοιπόν να προσθέσουμε δύο ακόμα constructors – έναν που δεν χρειάζεται καμία παράμετρο (no argument) και έναν που δέχεται μόνο μια μεταβλητή.
Account.java
Τώρα όταν πάμε στην MyAccount να δημιουργήσουμε ένα αντικείμενο Account θα δούμε τρεις επιλογές όπως δείχνει η παρακάτω εικόνα.
Ανάλογα με την επιλογή μας θα χρειαστεί ίσως να προσθέσετε και άλλες πληροφορίες στο αντικείμενο με τις setter και getter μεθόδους. Για παράδειγμα, αν καλέσετε τον constructor με το όνομα Account(double balance) αυτό σημαίνει ότι θα πρέπει λογικά να καλέσετε, μετά την δημιουργία του αντικειμένου, και την setName(String name ) για να αποκτήσει ο λογαριασμός και όνομα ιδιοκτήτη.
Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το blog να μεγαλώσει ακόμα πιο πολύ και να έχει περισσότερες δυνατότητες στην online παράδοση δωρεάν μαθημάτων.
full-width
0 Comments
Η γνώμη σας είναι σημαντική.