java:tostring

Η μέθοδος toString

Αναπαράσταση δεδομένων αντικειμένου σε μορφή κειμένου

Θυμηθείτε την κλάση Point που ορίσαμε σε προηγούμενη ενότητα. Θα θέλαμε να μπορούμε να γράψουμε:

Point aPoint = new Point(4, 5);
System.out.println(aPoint);

και να εκτυπωθούν στην οθόνη τα δεδομένα του σημείου που ορίσαμε, δηλαδή οι συντεταγμένες, σε κατανοητή μορφή κειμένου η οποία διαβάζεται εύκολα από τον χρήστη, για παράδειγμα, (4, 5)

Αν όμως εκτελέσουμε το παραπάνω κομμάτι κώδικα, τότε θα εκτυπωθεί κάτι αρκετά διαφορετικό: Point@5ffdfb42, το οποίο αποτελείται από το όνομα της κλάσης στην οποία ανήκει το αντικείμενό μας και ένα ειδικό κωδικό (hash code) για τον οποίο μπορείτε να διαβάσετε στην ενότητα για την κλάση Object .

Αυτό που δε φαίνεται στον κώδικα είναι ότι όταν ζητάμε να αντιμετωπιστεί ένα αντικείμενο ως κείμενο (πχ. για να εκτυπωθεί στην οθόνη) τότε καλείται έμμεσα μια συνάρτηση με όνομα 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/tostring.txt · Last modified: 2017/02/16 12:17 by gthanos