This is an old revision of the document!
Table of Contents
Η μέθοδος toString
Αναπαράσταση δεδομένων αντικειμένου σε μορφή κειμένου
Θυμηθείτε την κλάση Point που ορίσαμε σε προηγούμενη ενότητα. Θα θέλαμε να μπορούμε να γράψουμε:
Point aPoint = new Point(4, 5); System.out.println(aPoint);
και να εκτυπωθούν στην οθόνη τα δεδομένα του σημείου που ορίσαμε, σε κατανοητή μορφή κειμένου η οποία διαβάζεται εύκολα από τον χρήστη, για παράδειγμα, (4, 5)
Αν όμως εκτελέσουμε το παραπάνω κομμάτι κώδικα, τότε θα εκτυπωθεί κάτι αρκετά διαφορετικό: Point@5ffdfb42
, το οποίο αποτελείται από το όνομα της κλάσης στην οποία ανήκει το αντικείμενό μας και ένα ειδικό κωδικό (hash code) τον οποίο δε θα καλύψουμε στα πλαίσια αυτού του μαθήματος.
Αυτό που δε φαίνεται στον κώδικα είναι ότι όταν ζητάμε να αντιμετωπιστεί ένα αντικείμενο ως κείμενο (πχ. για να εκτυπωθεί στην οθόνη) τότε καλείται έμμεσα μια συνάρτηση με όνομα toString η οποία είναι προκαθορισμένη για κάθε κλάση και επιστρέφει ένα String όπως το Point@5ffdfb42. Στην πραγματικότητα ο κώδικας που εκτελέστηκε ήταν :
System.out.println(aPoint.toString());
Το ερώτημα είναι, πώς μπορούμε να εκτυπώσουμε το πιο φιλικό (4, 5)
;
Ένας απλός τρόπος είναι χρησιμοποιώντας τους getters που παρέχει η κλάση:
System.out.println( "(" + aPoint.getX() + ", " + aPoint.getY() + ")");
Δύο μειονεκτήματα αυτής της λύσης είναι ότι συχνά μια κλάση δεν παρέχει getters για όλα τα πεδία που πιθανώς θέλουμε να εμφανίζονται σε μια “κειμενική” αναπαράσταση και το ότι υποχρεώνουμε τον χρήστη της κλάσης να υλοποιήσει μια λειτουργία που θα ήταν πιο σωστό να παρέχει άμεσα η ίδια η κλάση.
Ο σωστός τρόπος να επιτύχουμε αυτό που θέλουμε είναι υπερκαλύπτοντας τη μέθοδο toString(). Η υπερκάλυψη (override) μιας μεθόδου θα εξηγηθεί λεπτομερώς σε επόμενη ενότητα. Προς το παρόν, αρκεί να γνωρίζετε τα εξής:
- Η μέθοδος toString είναι ήδη ορισμένη για όλες τις κλάσεις και επιστρέφει μια κειμενική αναπαράσταση ενός αντικειμένου. - Υπάρχει η δυνατότητα να την ξαναορίσουμε σε μια κλάση, υλοποιώντας τη με τον τρόπο που θέλουμε - Η δική μας υλοποίηση, εφόσον υπάρχει, έχει προτεραιότητα έναντι της προκαθορισμένης υλοποίησης.
Ορίζουμε λοιπόν στην κλάση Point:
@Override public String toString () { return "(" + x + ", " + y + ")"; }
και τώρα όταν γράψουμε στο πρόγραμμά μας
System.out.println(aPoint);
θα δούμε στην οθόνη: (4, 5)
Προηγούμενο: Αρχικοποίηση των μελών της κλάσης | Περιεχόμενα | Επόμενο: Πακέτα στη γλώσσα προγραμματισμού Java |