This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
java:jfc_intf_sort [2015/03/23 05:06] gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων] |
java:jfc_intf_sort [2017/05/12 12:18] (current) gthanos [Υλοποιώντας το interface Comparable για δικούς μας τύπους δεδομένων] |
||
---|---|---|---|
Line 48: | Line 48: | ||
Τα βασικά χαρακτηριστικά της παραπάνω κλάσης είναι τα εξής: | Τα βασικά χαρακτηριστικά της παραπάνω κλάσης είναι τα εξής: | ||
* Έλεγχος στον κατασκευαστή εάν περνάνε ή όχι null ορίσματα. Αυτό μας προστατεύει από το να έρθουμε αντιμέτωποι με //NullPointerException// στην συνέχεια. | * Έλεγχος στον κατασκευαστή εάν περνάνε ή όχι null ορίσματα. Αυτό μας προστατεύει από το να έρθουμε αντιμέτωποι με //NullPointerException// στην συνέχεια. | ||
- | * Η μέθοδος //equal()// επαναπροσδιορίζεται, έτσι ώστε να συγκρίνονται τα πεδία της κλάσης Name μεταξύ τους. | + | * Η μέθοδος //equals()// επαναπροσδιορίζεται, έτσι ώστε να συγκρίνονται τα πεδία της κλάσης Name μεταξύ τους. |
* Η μέθοδος //hashCode()// επαναπροσδιορίζεται. Ο λόγος που πρέπει να επαναπροσδιορίσουμε την μέθοδο αυτή είναι ότι εξ' ορισμού δύο ίδια αντικείμενα θα πρέπει να έχουν και ίδια //hashCodes//. Εφόσον άλλαξε η μέθοδος //equal()// θα αλλάξει και η μέθοδος //hashCode()// ώστε να επιστρέφει το ίδιο hash για αντικείμενα που η equals επιστρέφει ισότητα. | * Η μέθοδος //hashCode()// επαναπροσδιορίζεται. Ο λόγος που πρέπει να επαναπροσδιορίσουμε την μέθοδο αυτή είναι ότι εξ' ορισμού δύο ίδια αντικείμενα θα πρέπει να έχουν και ίδια //hashCodes//. Εφόσον άλλαξε η μέθοδος //equal()// θα αλλάξει και η μέθοδος //hashCode()// ώστε να επιστρέφει το ίδιο hash για αντικείμενα που η equals επιστρέφει ισότητα. | ||
* Υλοποιείται η μέθοδος //int comparTo(T t)//. | * Υλοποιείται η μέθοδος //int comparTo(T t)//. | ||
<WRAP 85% center round tip> | <WRAP 85% center round tip> | ||
- | Εξ' ορισμού (εάν δεν την επαναπροσδιορίσετε) η μέθοδος [[http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html|equals συγκρίνει δύο αντικείμενα]] με βάση την διεύθυνση στην οποία δίχνει η μεταβλητή του κάθε αντικειμένου. Στην πραγματικότητα επιστρέφει ισότητα __μόνο αν τα references των δύο αντικειμένων είναι ίδια__, δηλ. και οι δύο μεταβλητές δείχνουν στο ίδιο αντικείμενο. Στην πλειοψηφία των περιπτώσεων ο συγκεκριμένος τρόπος σύκρισης δεν μας δίνει στην πράξη ικανοποιητικό αποτελέσμα. | + | Εξ' ορισμού (εάν δεν την επαναπροσδιορίσετε) η μέθοδος [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-|equals]], [[http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html|συγκρίνει δύο αντικείμενα με βάση την διεύθυνση του κάθε αντικειμένου]]. Στην πραγματικότητα επιστρέφει ισότητα __μόνο αν τα references των δύο αντικειμένων είναι ίδια__, δηλ. και οι δύο μεταβλητές δείχνουν στο ίδιο αντικείμενο. Στην πλειοψηφία των περιπτώσεων ο συγκεκριμένος τρόπος σύκρισης δεν μας δίνει στην πράξη ικανοποιητικό αποτελέσμα, καθώς αγνοεί αντικείμενα με τα ίδια περιεχόμενα. |
- | Σε αναλογία η μέθοδος //hashCode// επιστρέφει την δεκαεξαδική τιμή που δείχνει η μεταβλητή του αντικειμένου στην μνήμη. Με δεδομένο ότι για δύο ίδια αντικείμενα τα hashCodes τους θα πρέπει να είναι κοινά, η default υλοποίηση ταιριάζει με την default υλοποίηση της μεθόδο //equal//. Αν όμως αλλάξει η //equal// θα πρέπει να αλλάξει και η //hashCode()// ώστε δύο ίδια αντικείμενα κατά την //equal// να έχουν και ίδια hashCode. | + | Σε αναλογία η μέθοδος [[https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--|hashCode]] επιστρέφει την δεκαεξαδική τιμή που δείχνει η μεταβλητή του αντικειμένου στην μνήμη. Με δεδομένο ότι __για δύο ίδια αντικείμενα τα hashCodes τους θα πρέπει να είναι κοινά__, η default υλοποίηση ταιριάζει με την default υλοποίηση της μεθόδου //equals//. Αν όμως αλλάξει η υλοποίηση της //equals// σε μία κλάση θα πρέπει να αλλάξει και η //hashCode()// ώστε δύο ίδια αντικείμενα κατά την μέθοδο //equals// να έχουν και ίδια hashCodes. |
</WRAP> | </WRAP> | ||
Line 76: | Line 76: | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | ===== Συγκρίνοντας με χρήσης ενός Comparator object ===== | ||
+ | |||
+ | Ας υποθέσουμε ότι θέλουμε να συγκρίνουμε αντικείμενα με διαφορετική μέθοδο από την μέθοδο με την οποία συγκρίνονται ή ότι θέλουμε να συγκρίνουμε αντικείμενα τα οποία δεν υλοποιούν το interface //Comparable//. Σε αυτή την περίπτωση θα χρειαστείουμε ένα βοηθητικό αντικείμενο του τύπου [[http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html|Comparator]], όπως παρακάτω | ||
<code java NameComparatorSort.java> | <code java NameComparatorSort.java> | ||
Line 101: | Line 105: | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | Ο συγκεκριμένος //Comparator// μας δίνει την δυνατότητα να αλλάξουμε την μέθοδο με την οποία συγκρίνονται τα αντικείμενα του συγκεκριμένου τύπου δεδομένων δίνοντας προτεραιότητα στο μικρό όνομα αντί για το επίθετο. | ||