Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Generics και η κλάση ArrayList. Εισαγωγή στα Generics

Σχετικά έγγραφα
Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιεπαφές και Εσωτερικές κλάσεις Interfaces and Inner Classes. ιεπαφές - Interfaces

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιαχείριση Εξαιρέσεων. Εισαγωγή στη ιαχείριση Εξαιρέσεων

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

2.1 Αντικειµενοστρεφής προγραµµατισµός

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Βασικά της γλώσσας JAVA

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Αντικειμενοστρεφής Προγραμματισμός

Αντικειµενοστρεφής Προγραµµατισµός

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Ειδικά Θέματα Προγραμματισμού

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Wrapper Classes, Abstract Classes and Interfaces

Κλάσεις και Αντικείµενα

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Οντοκεντρικός Προγραμματισμός

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Βασικά Στοιχεία της Java

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Οντοκεντρικός Προγραμματισμός

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συνδεδεµένες οµές εδοµένων. Εισαγωγή στις Συνδεδεµένες οµές εδοµένων

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

H κλάση ArrayList. Γιώργος Θάνος. Γραφείο Γ. Γκλαβάνη 37. Αντικει ενοστραφής Προγρα. ος όροφος

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Διαγράμματα Κλάσεων στη Σχεδίαση

Αντικειμενοστραφής Προγραμματισμός

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Εξαιρέσεις. try, catch, finally, throw, throws

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Βασικά Στοιχεία της Java

(Διαφάνειες Νίκου Βιδάκη)

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Προγράμματα με δομή Κληρονομικότητας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

Μέθοδοι. Υποσυστήµατα και πακέτα. Μοντέλα αντικειµενοστραφούς σχεδίασης. Αντικειµενοστραφής Σχεδίαση. Στα πρώτα στάδια της ανάλυσης

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Μπορείτε να δηλώσετε πίνακα οποιουδήποτε τύπου είτε βασικού είτε κλάσης:

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Generics και ArrayLists

ΕΞΑΙΡΕΣΕΙΣ. Εξαιρέσεις προκαλούνται. από το σύστηµα. από το πρόγραµµα

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Οντοκεντρικός Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Εργαλεία του JDK. Β.1 Εργαλεία του JDK. Β.2 Μεταγλωττιστής javac. Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω.

Ειδικά Θέματα Προγραμματισμού

Δομές Δεδομένων Boost C++ Libraries. 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

Αντικειμενοστρεφής Προγραμματισμός

Week. 6: Java Collections

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Αλφαριθµητικά Κλάση string

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Transcript:

Προγραµµατισµός ΙΙ Ηγλώσσααντικειµενοστραφούς προγραµµατισµού Java ιδάσκων ηµήτριος Κατσαρός, Ph.D. @ Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας ιάλεξη 12η: 30/08/2006 1 Generics και η κλάση ArrayList Generics and the ArrayList Class 2 Εισαγωγή στα Generics Από την έκδοση 5.0, η Java επιτρέπει ορισµούς κλάσεων και µεθόδων που έχουν ως παραµέτρους τύπους δεδοµένων (είναι το ανάλογο των templates στη C++) Τέτοιοι ορισµοί ονοµάζονται generics Ο προγραµµατισµός µε generics µε παράµετρο κάποιον τύπο επιτρέπει να γραφεί κώδικας που εφαρµόζεται σε οποιαδήποτε κλάση 3 1

ΗκλάσηArrayList Η ArrayList είναι µια κλάση των standard βιβλιοθηκών της Java ιαφορετικά από τους πίνακες, οι οποίοι έχουν σταθερό µήκος αφού δηµιουργηθούν, µια ArrayList είναι ένα αντικείµενο που µπορεί να µεγαλώνει και να µικραίνει κατά τη διάρκεια εκτέλεσης του προγράµµατος Γενικά, µια ArrayList υπηρετεί τον ίδιο σκοπό µε ένα πίνακα, εκτός του ότι η ArrayList µπορεί να αλλάζει µήκος (µέγεθος) κατά τη διάρκεια εκτέλεσης του προγράµµατος 4 ΗκλάσηArrayList ΗκλάσηArrayList υλοποιείται µε χρήση ενός πίνακα ως ιδιωτική (private) instance variable Όταν αυτός ο κρυφός πίνακας γεµίσει, ένας νέος µεγαλύτερος πίνακας δηµιουργείται και τα δεδοµένα µεταφέρονται από τον παλιό στον νέο πίνακα 5 ΗκλάσηArrayList Γιατί να µην χρησιµοποιούµε πάντα µια ArrayList αντί για έναν πίνακα? 1. Μια ArrayList είναι λιγότερο αποδοτική από ότι ένας πίνακας 2. εν υποστηρίζει τις αγκύλες [] (dereferencing) 3. Οβασικόςτύπος(base type) µιας ArrayList πρέπει να είναι τύπου κλάσης (ή άλλου reference τύπου): δεν µπορεί να είναι primitive τύπου δεδοµένων Το τελευταίο πρόβληµα δεν είναι ιδιαίτερα σηµαντικό, αφού η Java 5.0 υποστηρίζει αυτόµατη µετατροπή τύπων primitive στους αντίστοιχους reference τύπους και αντίστροφα 6 2

Χρήση της κλάσης ArrayList Γιανακάνουµε χρήσητηςκλάσηςarraylist, πρέπει να κάνουµε import το package java.util Μια ArrayList δηµιουργείται και ονοµατίζεται µε τον ίδιο τρόπο όπως τα αντικείµενα κάθε κλάσης, εκτός του ότι καθορίζουµε τον βασικό τύπο ως εξής: ArrayList<BaseType> alist = new ArrayList<BaseType>(); 7 Χρήση της κλάσης ArrayList Μπορούµε να καθορίσουµε µια αρχική χωριτικότητα όταν δηµιουργούµε ένααντικείµενο της ArrayList Ο παρακάτω κώδικας δηµιουργεί µια ArrayList που αποθηκεύει αντικείµενα βασικού τύπου String µε αρχική χωριτικότητα 20 στοιχείων ArrayList<String> list = new ArrayList<String>(20); Οκαθορισµός µιας αρχικής χωριτικότητα δεν περιορίζει το µέγεθος στο οποίο µπορεί να φτάσει µια ArrayList Σηµειώστε ότι ο βασικός τύπος µιας ArrayList καθορίζεται ως παράµετρος τύπου (type parameter) 8 Χρήση της κλάσης ArrayList Η µέθοδος add χρησιµοποιείται για να θέσουµε ένα στοιχείο για πρώτη φορά σε µια ArrayList list.add("something"); Το όνοµα της µεθόδου add είναι overloaded Υπάρχει επίσης µια έκδοση της µεθόδου µε δυο ορίσµατα που επιτρέπει σε ένα στοιχείο να προστεθεί σε οποιαδήποτε ήδη χρησιµοποιουµενη θέση ή σε στην πρώτη µη χρησιµοποιούµενη θέση 9 3

Χρήση της κλάσης ArrayList Η µέθοδος size χρησιµοποιείται για να υπολογίσουµε πόσοι δείκτες έχουν ήδη στοιχεία στην ArrayList int howmany = list.size(); Η µέθοδος set χρησιµοποιείται για να αντικαταστήσουµε οποιοδήποτε υπάρχον στοιχείο, και η µέθοδος get για να προσπελάσουµε τηντιµή οποιουδήποτε υπάρχοντος στοιχείου list.set(index, "something else"); String thing = list.get(index); 10 Υπόδειξη: Σύνοψη της προσθήκης σε µια ArrayList Η µέθοδος add συνήθως χρησιµοποιείται για να τοποθετήσουµε ένα στοιχείο σε θέση µιας ArrayList για πρώτη φορά (σε έναν δείκτη της ArrayList) Η απλούστερη µέθοδος add έχει µια παράµετρο γιατοστοιχείοπουθαπροστεθεί, και το τοποθετεί στην επόµενη κενή θέση 11 Υπόδειξη: Σύνοψη της προσθήκης σε µια ArrayList Ένα στοιχείο µπορεί να προστεθεί σε µια ήδη κατειλληµένηθέσητηςλίσταςκάνονταςχρήση της έκδοσης της µεθόδου add µε τιςδυο παραµέτρους Αυτό έχει ως συνέπεια το νέο στοιχείο να προστεθεί στη θέση που καθορίζουµε, και κάθε άλλο µέλος της ArrayList να µετακινηθεί µια θέση 12 4

Υπόδειξη: Σύνοψη της προσθήκης σε µια ArrayList Η έκδοση της add µε τα δυο ορίσµατα µπορεί επίσης να χρησιµοποιηθεί για να προσθέσουµε ένα στοιχείο στην πρώτη κενή θέση (εάν είναι γνωστό ποια είναι αυτή) Κάθε στοιχείο µπορεί να αλλαχτεί µε τη µέθοδο set Όµως, η set µπορεί µόνονααλλάξειτοστοιχείοσε µια θέση η οποία ήδη περιέχει κάποιο άλλο στοιχείο Επιπλέον, η µέθοδος size µπορεί να χρησιµοποιηθείγιαναπροσδιορίσουµε πόσα στοιχεία είναι αποθηκευµένα σε µια ArrayList 13 Μέθοδοι της κλάσης ArrayList Το µόνο διαθέσιµο εργαλείο για το χειρισµό των πινάκων είναι οι αγκύλες [] και την instance variable length Οι ArrayLists, όµως, περιλαµβάνουν ισχυρές µεθόδους οι οποίες µπορούν να κάνουν πολλά πράγµατα τα οποία θα απαιτούσαν να γραφούν µεγάλα κοµµάτια κώδικα εάν χρησιµοποιούσαµε πίνακες 14 Μερικές µέθοδοι της ArrayList (1/11) 15 5

Μερικές µέθοδοι της ArrayList (2/11) 16 Μερικές µέθοδοι της ArrayList (3/11) 17 Μερικές µέθοδοι της ArrayList (4/11) 18 6

Μερικές µέθοδοι της ArrayList (5/11) 19 Μερικές µέθοδοι της ArrayList (6/11) 20 Μερικές µέθοδοι της ArrayList (7/11) 21 7

Μερικές µέθοδοι της ArrayList (8/11) 22 Μερικές µέθοδοι της ArrayList (9/11) 23 Μερικές µέθοδοι της ArrayList (10/11) 24 8

Μερικές µέθοδοι της ArrayList (11/11) 25 Γιατί µερικοί παράµετροι είναι τύπου Base_Type καιάλλοιείναιτύπουobject Όταν κοιτάζουµε τιςµεθόδους της κλάσης ArrayList, παρατηρούµε µια ασυνέπεια Σε µερικές περιπτώσεις, όταν µια παράµετρος είναι φυσιολογκά ένα αντικείµενο του βασικού τύπου, ο τύπος της παραµέτρου είναι του βασικού τύπου Όµως, σε άλλες περιπτώσεις, είναι τύπου Object Αυτό συµβαίνει επειδή η κλάση ArrayList υλοποιεί έναν αριθµό interfaces, και κληρονοµεί µεθόδους από διάφορες κλάσεις προγόνους Αυτά τα interfaces και οι κλάσεις πρόγονοι καθορίζουν ότι κάποιες παράµετροι είναι τύπου Object 26 Οβρόχος"For Each" Η κλάση ArrayList είναι ένα παράδειγµα µιας κλάσης collection Από την έκδοση 5.0, η Java έχει ένα νέο είδος βρόχου for που ονοµάζεται for-each ή βρόχος enhanced for Αυτό το είδος βρόχου έχει σχεδιαστεί για να διατρέχει τα στοιχεία µιας συλλογής (collection), όπως µια ArrayList) 27 9

Βρόχος for-each µε ArrayList (1/3) 28 Βρόχος for-each µε ArrayList (2/3) 29 Βρόχος for-each µε ArrayList (3/3) 30 10

Πρόγραµµα Golf Score (1/6) 31 Πρόγραµµα Golf Score (2/6) 32 Πρόγραµµα Golf Score (3/6) 33 11

Πρόγραµµα Golf Score (4/6) 34 Πρόγραµµα Golf Score (5/6) 35 Πρόγραµµα Golf Score (6/6) 36 12

Υπόδειξη: Χρησιµοποιήστε την trimtosize γιαναεξοικονήσετεµνήµη Μια ArrayList αυτόµατα αυξάνει την χωριτικότηταά της όταν αυτό απαιτείται Όµως, η χωριτικότητα µπορεί να αυξηθεί πέρα από αυτό που απαιτεί ένα πρόγραµµα Επιπλέον, παρόλο που µια ArrayList αυξάνει αυτόµατα όταν χρειαστεί, δεν ελαττώνεται αυτόµατα Εάν µια ArrayList έχει µεγάλο ποσό περιττής χωριτικότητας, η ενεργοποίηση της µεθόδου trimtosize θα ελαττώσει την χωριτικότητα της ArrayList στο µέγεθος που χρειάζεται 37 Παγίδα: Η µέθοδος clone δηµιουργεί ρηχά αντίγραφα Όταν χρειάζεται ένα βαθύ αντιγραφο (deep copy) µιας ArrayList, η χρήση της µεθόδου δεν επαρκεί Η ενεργοποίηση της clone σε ένα αντικείµενο ArrayList παράγει ένα ρηχό αντίγραφο (shallow copy), και όχι ένα βαθύ αντίγραφο (deep copy) Γιαναφτιάξουµε έναdeep copy, πρέπει να έχουµε τη δυνατότητα να φτιάξουµε deep copy των αντικειµένων του βασικού τύπου Κατόπιν ένα deep copy κάθε στοιχείου της ArrayList µπορεί να δηµιουργθεί και να τοποθετηθεί σε ένα νέο αντικείµενο ArrayList 38 ΗκλάσηVector Οι standard libraries της Java έχουν µια κλάση µε όνοµα Vector που συµπεριφέρεται σχεδόν όπως και η κλάση ArrayList Στις περισσότερες καταστάσεις, µπορεί να χρησιµοποιηθεί οποιαδήποτε από τις δυο Όµως η κλάση ArrayList είναι νεότερη, και σταδιακά γίνεται η προτιµητέα 39 13

Παραµετροποιοηµένες κλάσεις και Generics ΗκλάσηArrayList είναι µια παραµετροποιηµένη κλάση (parameterized class) Έχει µια παράµετρο, που συµβολίζεται µε Base_Type, που µπορεί να αντικατασταθεί από οποιονδηποτε άλλο reference type για να προκύψει µια κλάση της ArrayLists µε τον καθορισµένοβασικότύπο Από την έκδοση 5.0, η Java επιτρέπει ορισµούς κλάσεων και µεθόδων µε τύπους ως παραµέτρους Αυτές οι κλάσεις που έχουν τύπους ως παραµέτρους αποκαλούνται parameterized class ή generic definitions, ή, απλά, generics 40 Μη-παραµετροποιηµένες κλάσεις ArrayList και Vector Οι κλάσεις ArrayList και Vector έχουν µια παράµετρο τύπου για τον βασικό τύπο Υπάρχουν επίσης ArrayList και Vector κλάσεις χωρίς παράµετρο, των οποίων ο τύπος είναι Object Αυτές οι κλάσεις είναι κατάλοιπα παλιότερων εκδόσεων της Java 41 Generics Κλάσεις και µέθοδοι µπορεί να έχουν παράµετρο τύπου Μια παράµετρος τύπου µπορεί να έχει οποιοδήποτε reference type (δηλ., τύπο κλάσης) ενσωµατωµένο στην παράµετρο Όταν ενσωµατώνεται ένας συγκεκριµένος τύπος, τότε παράγεαι ένας συγκεκριµένος τύπος κλάσης ή µεθόδου 42 14

Generics Ένας ορισµός κλάσης µε µια παράµετρο τύπου αποθηκεύεται σε ένα αρχείο και µεταγλωττίζεται κανονικά όπως κάθε άλλη κλάση Αφού µεταγλωττιστεί µια παραµετροποιηµένη κλάση, µπορεί να χρησιµοποιηθεί όπως κάθε άλλη κλάση Όµως, ο τύπος κλάσης που εσνωµατώνεται µέσα στην παράµετρο τύπου πρέπει να καθοριστεί πριν χρησιµοποιηθεί στο πρόγραµµα Κάνοντας αυτό θα λέµε ότι κάνουµε instantiate την generic κλάση Sample<String> object = new Sample<String>(); 43 Ορισµός κλάσης µε παράµετρο τύπου 44 Ορισµός κλάσης µε παράµετρο τύπου Μια κλάση που ορίζεται µε µια παράµετρο για έναν τύπο καλείται generic class ή parameterized class Η παράµετρος τύπου περικλείεται σε γωνιώδεις αγκύλες (angular brackets) µετά το όνοµα της κλάσης στην κεφαλίδα του ορισµού της κλάσης Οποιοσδήποτε non-keyword identifier µπορεί να χρησιµοποιηθεί ως παράµετρος τύπου, αλλά από σύµβαση, ηπαράµετρος ξεκινά µε κεφαλαίο γράµµα Η παράµετρος τύπου µπορεί να χρησιµοποιηθεί όπως καιοιάλλοιτύποιπουχρησιµοποιούνται στον ορισµό µιας κλάσης 45 15

Υπόδειξη: Μεταγλώττιση µε την επιλογή -Xlint Υπάρχουν πολλές παγίδες όταν χρησιµοποιούµε παραµέτρους τύπων Μεταγλωττιζοντας µε την επιλογή-xlint παρέχει καλύτερα διαγνωστικά για οποιαδήποτε προβλήµατα στον κώδικα javac Xlint Sample.java 46 Generic Ordered Pair Class (1/4) 47 Generic Ordered Pair Class (2/4) 48 16

Generic Ordered Pair Class (3/4) 49 Generic Ordered Pair Class (4/4) 50 Χρήση της Ordered Pair Class (1/3) 51 17

Χρήση της Ordered Pair Class (2/3) 52 Χρήση της Ordered Pair Class (3/3) 53 Παγίδα: Ο constructor µιας κλάσης Generic δεν έχει παράµετρο τύπου Παρόλο που το όνοµα µιας κλάσης στον ορισµό µιας παραµετροποιηµένης κλάσης έχει µια παράµετρο τύπου, αυτή η παράµετρος δεν χρησιµοποιείται στην κεφαλίδα του ορισµού του constructor public Pair<T>() Ο constructor µπορεί να χρησιµοποιήσει την παράµετρο τύπου ως τοντύπο µιας παραµέτρου στον, αλλά στην περίπτωση αυτή, δεν χρησιµοποιούνται οι angular brackets public Pair(T first, T second) Όµως, όταν µια generic class αρχικοποιείται (instantiated), οι angular brackets χρησιµοποιουνται Pair<String> pair = new Pair<STring>("Happy","Day"); 54 18

Παγίδα: Ένας primitive τύπος δεν µπορεί να µπει στη θέση µιας παραµέτρου τύπου Οτύποςπουενσωµατώνεται σε µια παράµετρο τύπου πρέπει πάντα να είναι reference type εν µπορεί να είναι primitive τύπου, όπως int, double, ή char Όµως, τώρα πλέον που η Java έχει αυτόµατο boxing, αυτό δεν αποτελεί πρόβληµα Σηµείωση: οι reference types µπορεί να περιλαµβάνουν πίνακες 55 Παγίδα: Μια παράµετρος τύπου δεν µπορεί να χρησιµοποιηθεί παντού όπου και το όνοµα ενόςτύπου Μέσα στον ορισµό µιας parameterized class, υπάρχουν σηµεία όπου το όνοµα µιας κανονικής κλάσης θα επιτρεπόταν, αλλά µια παράµετρος τύπου δεν επιτρέπεται Ειδικότερα, µια παράµετρος τύπου δεν µπορεί να χρησιµοποιηθεί σε απλές εκφράσεις µε χρήση του new για να δηµιουργήσουµε ένανέο αντικείµενο Για παράδειγµα, µια παράµετρος τύπου δεν µπορεί να χρησιµοποιηθεί ως όνοµα constructor ή όπως ένας constructor: T object = new T(); T[] a = new T[10]; 56 Παγίδα: Αρχικοποίηση µιας Generic κλάσης δεν µπορεί να έχει πίνακα ως βασικό τύπο Πίνακεςόπωςστηνεπόµενηδήλωσηδεν επιτρέπονται: Pair<String>[] a = new Pair<String>[10]; Παρόλο που αυτό είναι κάτι λογικό να κάνουµε, δεν επιτρέπεται δεδοµένου τουτρόπουπουηjava υλοποιεί τις generic κλάσεις 57 19

Χρήση της Ordered Pair κλάσης και αυτόµατο Boxing (1/3) 58 Χρήση της Ordered Pair κλάσης και αυτόµατο Boxing (2/3) 59 Χρήση της Ordered Pair κλάσης και αυτόµατο Boxing (3/3) 60 20

Παγίδα: Οορισµός µιας κλάσης µπορεί να έχει περισσότερες της µιας παραµέτρους τύπου Ο ορισµός µιας generic κλάσης µπορεί να έχει οποιοδήποτε αριθµό παραµέτρων τύπου Πολλαπλές παράµετροι τύπων παρατίθονται σε angular brackets όπως και στην περίπτωση της µιας παραµέτρου τύπου, αλλά διαχωρίζονται µε κόµµα 61 Πολλαπλοί παράµετροι τύπου (1/4) 62 Πολλαπλοί παράµετροι τύπου (2/4) 63 21

Πολλαπλοί παράµετροι τύπου (3/4) 64 Πολλαπλοί παράµετροι τύπου (4/4) 65 Παγίδα: Μια Generic κλάση δεν µπορεί να είναι Exception κλάση εν επιτρέπεται να δηµιουργούµε generic κλάσεις µε χρήσητωνexception, Error, Throwable, ή οποιασδήποτε άλλης κλάσηςαπογόνου της Throwable εν µπορούµε να δηµιουργήσουµε µια generic κλάση της οποίας τα αντικείµενα θα είναι throwable public class GEx<T> extends Exception Το παραπάνω παράδειγµα παράγειcompiler error µήνυµα 66 22

Χρήση µιας Generic κλάσης µε δυο παραµέτρους τύπου (1/2) 67 Χρήση µιας Generic κλάσης µε δυο παραµέτρους τύπου (2/2) 68 Όρια για παραµέτρους τύπου Μερικές φορές είναι χρήσιµο να περιορίζουµε του πιθανούς τύπους οι οποίοι µπορεί να ενσωµατωθούν σε µια παράµετρο τύπου T Για παράδειγµα, για να είµαστε σίγουροι ότι µόνο κλάσεις που υλοποιούν το interface Comparable θα ενσωµατώνονται στο T, ορίζουµε µια κλάση ως εξής: public class RClass<T extends Comparable> "extends Comparable" υπηρετεί το ρόλο του ορίου (bound) για την παράµετρο τύπου T Οποιαδήποτε απόπειρα να ενσωµατώσουµε ένα τύπο για το T οοποίοςδενυλοποιείτοinterface Comparable θα προκαλέσει µήνυµα compiler error 69 23

Όρια για παραµέτρους τύπου Ένα όριο σε έναν τύπο µπορείναείναικαιτο όνοµα µιας κλάσης Τότε µόνο κλάσεις απόγονοι της χρησιµοποιούµενης κλάσης µπορούν να ενσωµατωθούν στην παράµετρο τύπου public class ExClass<T extends Class1> Μια έκφραση ορίου µπορεί να περιέχει πολλαπλά interfaces και µέχρι µια το πολύ κλάση Εάν υπάρχουν παραπάνω από µια παράµετρος τύπου, η σύνταξη είναι η εξής: public class Two<T1 extends Class1, T2 extends Class2 & Comparable> 70 Μια παράµετρος τύπου µε όρια 71 Υπόδειξη: Generic Interfaces Ένα interface µπορεί να έχει µια ή περισσότερες παραµέτρους τύπου Οι λεπτοµέρειες και ο συµβολισµός είναι οι ίδιοι όπως και για τις κλάσεις µε παραµέτρους τύπου 72 24

Generic µέθοδοι Όταν ορίζεται µια generic κλάση, η παράµετρος τύπου µπορεί να χρησιµοποιηθεί στους ορισµούς των µεθόδων γι αυτή τη generic κλάση Επιπλέον, µπορεί να οριστεί µια generic µέθοδος η οποία έχει τη δική της παράµετρο τύπου, η οποίαπαράµετρος δεν είναι ίδια µε καµία παράµετρο τύπου κάποιας κλάσης Μια generic µέθοδος µπορεί να είναι µέλος µια κανονικής κλάσης ή να είναι µέλος µια generic κλάσης η οποία έχει κάποια άλλη παράµετρο τύπου Η παράµετρος τύπου µιας generic µεθόδου είναι τοπική (local) στη µέθοδο, όχι στην κλάση 73 Generic µέθοδοι Ηπαράµετρος τύπου πρέπει να τοποθετείται (σε angular brackets) µετά από όλους τους modifiers, και πριν από τον επιστρεφόµενο τύπο (returned type) public static <T> T genmethod(t[] a) Όταν ενεργοποιείται µια από αυτές τις generic µεθόδους, απότοόνοµα τηςµεθόδου προηγείται ο τύπος που θα ενσωµατωθεί, περικλειόµενος σε angular brackets String s = NonG.<String>genMethod(c); 74 Κληρονοµικότητα µε Generic κλάσεις Μια generic κλάση µπορεί να οριστεί ως παραγόµενη κλάσης µιας κανονικής κλάσης ή µιας άλλης generic κλάσης Όπως και στις κανονικές κλάσεις, ένα αντικείµενο τύπου της υποκλάσης θα είναι επίσης και τύπου της υπερκλάσης εδοµένων δυο κλάσεων: A και B, και δεδοµένης της G: µιας generic κλάσης, δεν υπάρχει σχσέση µεταξύ των G<A> και G<B> Αυτό είναι αληθές ανεξάρτητα από τη σχέση µεταξύ των κλάσεων A και B, π.χ., εάν η κλάση B είναι υποκλάση της κλάσης A 75 25

Μια παραγόµενη Generic κλάση (1/2) 76 Μια παραγόµενη Generic κλάση (2/2) 77 Χρήση της UnorderedPair (1/2) 78 26

Χρήση της UnorderedPair (2/2) 79 27