====== Η μέθοδος toString ======
===== Αναπαράσταση δεδομένων αντικειμένου σε μορφή κειμένου =====
Θυμηθείτε την κλάση **Point** που ορίσαμε σε προηγούμενη ενότητα. Θα θέλαμε να μπορούμε να γράψουμε:
Point aPoint = new Point(4, 5);
System.out.println(aPoint);
και να εκτυπωθούν στην οθόνη τα δεδομένα του σημείου που ορίσαμε, δηλαδή οι συντεταγμένες, σε κατανοητή μορφή κειμένου η οποία διαβάζεται εύκολα από τον χρήστη, για παράδειγμα, ''(4, 5)''
Αν όμως εκτελέσουμε το παραπάνω κομμάτι κώδικα, τότε θα εκτυπωθεί κάτι αρκετά διαφορετικό: ''Point@5ffdfb42'', το οποίο αποτελείται από το όνομα της κλάσης στην οποία ανήκει το αντικείμενό μας και ένα ειδικό κωδικό (hash code) για τον οποίο μπορείτε να διαβάσετε [[:java:object_class | στην ενότητα για την κλάση Object ]].
Αυτό που δε φαίνεται στον κώδικα είναι ότι όταν ζητάμε να αντιμετωπιστεί ένα αντικείμενο ως κείμενο (πχ. για να εκτυπωθεί στην οθόνη) τότε καλείται έμμεσα μια συνάρτηση με όνομα **toString** η οποία είναι προκαθορισμένη για κάθε κλάση και επιστρέφει ένα String όπως το Point@5ffdfb42. Στην πραγματικότητα, ο compiler βλέπει ότι η μέθοδος //println// λαμβάνει ως όρισμα ένα αντικείμενο τύπου String και καλεί την μέθοδο **toString** (η μέθοδος επιστρέφει String) για το αντικείμενο της κλάσης. Τελικά ο κώδικας που εκτελέστηκε ήταν :
System.out.println(aPoint.toString());
Το ερώτημα είναι, πώς μπορούμε να εκτυπώσουμε το πιο φιλικό ''(4, 5)'' ;
Ένας απλός τρόπος είναι χρησιμοποιώντας τους getters που παρέχει η κλάση:
System.out.println( "(" + aPoint.getX() + ", " + aPoint.getY() + ")");
Ένα σημαντικό μειονέκτημα της παραπάνω "λύσης" είναι ότι υποχρεώνουμε το χρήστη της κλάσης να υλοποιήσει μια λειτουργία που θα ήταν πιο σωστό να παρέχει αυτόματα η ίδια η κλάση. Η κλάση είναι αυτή που έχει πρόσβαση σε όλα τα πεδία (πιθανώς να μην διατίθενται getters για όλα), και μπορεί να εγγυηθεί ότι η κειμενική αναπαράσταση θα έχει πάντα ακριβώς την ίδια μορφή.
Ο σωστός τρόπος να επιτύχουμε αυτό που θέλουμε είναι υπερκαλύπτοντας τη μέθοδο **toString()**. Η υπερκάλυψη (**override**) μιας μεθόδου θα εξηγηθεί λεπτομερώς σε επόμενη ενότητα. Προς το παρόν, αρκεί να γνωρίζετε τα εξής:
* Η μέθοδος **toString** είναι ήδη ορισμένη για όλες τις κλάσεις και επιστρέφει μια κειμενική αναπαράσταση για κάθε αντικείμενο.
* Υπάρχει η δυνατότητα να ξαναορίσουμε τη μέθοδο **toString** σε μια κλάση, υλοποιώντας τη με τον τρόπο που θέλουμε.
* Η δική μας υλοποίηση, εφόσον υπάρχει, έχει προτεραιότητα έναντι της προκαθορισμένης υλοποίησης.
Ορίζουμε λοιπόν στην κλάση Point την μέθοδο ''public String toString()'' ως εξής:
@Override
public String toString () {
return "(" + x + ", " + y + ")";
}
και τώρα όταν γράψουμε στο πρόγραμμά μας
System.out.println(aPoint);
θα εμφανιστεί στην οθόνη: ''(4, 5)''.
|Προηγούμενο: [[:java:string| Αλφαριθμητικά ]] | [[:toc | Περιεχόμενα]] | Επόμενο: [[:java:enum | Απαριθμήσεις ]]|