====== Μη στατικές εμφωλευμένες κλάσεις ====== Οι μη στατικές εμφωλευμένες κλάσεις ή εσωτερικές κλάσεις (inner classes) αποτελούν την γενικότερη περίπτωση εμφώλευσης μίας κλάσης μέσα σε μία άλλη κλάση. Ας υποθέσουμε ότι θέλουμε να κατασκευάσουμε μία διπλά συνδεδεμένη λίστα η οποία μπορεί να αποθηκεύσει οποιονδήποτε τύπο όμοιων αντικειμένων. Η λίστα θα χρειαστεί να έχει δύο βοηθητικές κλάσεις - την κλάση που περιγράφει τον κόμβο της λίστας και - μία κλάση τύπου //iterator// για την διάτρεξη της λίστας Οι δύο παραπάνω κλάσεις εξυπηρετεί να δηλωθούν ως εσωτερικές κλάσεις αποκρύπτοντας την υλοποίηση των κλάσεων αυτών. Το παραπάνω επιτρέπει η λίστα να είναι συμβατή με τα interfaces [[http://docs.oracle.com/javase/8/docs/api/java/util/List.html|java.util.List]] και [[http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]]. Δείτε τον παρακάτω κώδικα που την υλοποιεί. public class LinkedList { private Node head, tail; public LinkedList() { head = new Node<>(null, null, null); tail = new Node<>(null, head, null); head.setNext(tail); } private class Node { private Node next, prev; private E e; public Node(Node nxt, Node prv, E elem) { next = nxt; prev = prv; e = elem; } public Node getNext() {return next;} public void setNext(Node nxt) { next = nxt; } public Node getPrev() {return prev;} public void setPrev(Node prv) { prev = prv; } public E getElement() { return e; } public void setElement(E elem) { e = elem; } } private class Iterator implements java.util.Iterator { Node curr; public Iterator(Node c) { curr = c; } public boolean hasNext() { if(curr.getNext() != tail) return true; return false; } public E next() { curr = curr.getNext(); return curr.getElement(); } public void remove() { curr.getPrev().setNext(curr.getNext()); curr.getNext().setPrev(curr.getPrev()); curr = null; } } Iterator iterator() { return new Iterator(head); } // append in the end public void add(E elem) { Node plus = new Node(tail, tail.getPrev(), elem); tail.getPrev().setNext(plus); tail.setPrev(plus); } public boolean contains(E elem) { Iterator it = iterator(); while(it.hasNext()) { E e = it.next(); if( e.equals(elem) ) return true; } return false; } public int indexOf(E elem) { Iterator it = iterator(); int index = -1; while(it.hasNext()) { E e = it.next(); index++; if( e.equals(elem) ) return index; } return -1; } } Το παρακάτω πρόγραμμα επιχειρεί να δημιουργήσει μία λίστα με 20 τυχαίους αριθμούς και στη συνέχεια να τους εκτυπώσει χρησιμοποιώντας τον Iterator της λίστας. Παρατηρήστε ότι σε κανένα σημείου του προγράμματος δεν αποκαλύπτεται η ύπαρξη των εσωτερικών κλάσεων //Node// και //Iterator//. Η μεταβλητή //it// παραπέμπει στο interface [[http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html|java.util.Iterator]]. |Προηγούμενο: [[ :java:nested_classes| Εμφωλευμένες κλάσεις ]] | [[:toc|Περιεχόμενα]] |Επόμενο: [[ :java:inner_class_objects | Δημιουργία αντικειμένων της εσωτερικής κλάσης ]]|