User Tools

Site Tools


java:anon_inner_classes

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:anon_inner_classes [2018/03/21 09:58] – [Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης] gthanosjava:anon_inner_classes [2023/03/23 20:43] (current) – [Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface] gthanos
Line 4: Line 4:
  
 Ανώνυμες εμφωλευμένες κλάσεις μπορούμε να υλοποιήσουμε όταν συντρέχουν ταυτόχρονα οι παρακάτω λόγοι:  Ανώνυμες εμφωλευμένες κλάσεις μπορούμε να υλοποιήσουμε όταν συντρέχουν ταυτόχρονα οι παρακάτω λόγοι: 
-  - επιθυμούμε την υλοποίηση εσωτερικής κλάσης+  - θέλουμε να υλοποιήσουμε μία εσωτερική κλάση. 
-  - η κλάση αυτή υλοποιεί ένα interface ή επεκτείνει μία άλλη κλάση (η κλάση που επεκτείνεται μπορεί να είναι abstract ή όχι) και +  - η κλάση αυτή υλοποιεί ένα //interface// ή επεκτείνει μία υφιστάμενη κλάση (η κλάση που επεκτείνεται μπορεί να είναι //abstract// ή όχι) και 
   - από την κλάση αυτή επιθυμούμε να δημιουργηθεί μόνο ένα αντικείμενο.    - από την κλάση αυτή επιθυμούμε να δημιουργηθεί μόνο ένα αντικείμενο. 
    
-Σε αυτές τις περιπτώσεις η χρήση ανώνυμων κλάσεων μπορεί να είναι βολική, καθώς συμπιέζει τον όγκο του κώδικα. Από την άλλη πλευρά η εκτεταμένη χρήση ανώνυμων κλάσεων μπορεί να δημιουργήσει κώδικα που είναι δυσανάγνωστος.+Σε αυτές τις περιπτώσεις η χρήση ανώνυμων κλάσεων μπορεί να είναι βολική, καθώς συμπιέζει το μέγεθος του κώδικα. Από την άλλη πλευρά η εκτεταμένη χρήση ανώνυμων κλάσεων μπορεί να δημιουργήσει κώδικα που είναι δυσανάγνωστος.
  
 ===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface ===== ===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως υλοποίηση ενός interface =====
  
-Στο παρακάτω παράδειγμα ορίζουμε την κλάση **Student** η οποία έχει τα τρία (3) πεδία **firstName**, **lastName**, **AEM**. Στη μέθοδο **//main//** ορίζουμε μία λίστα (ArrayList) από δεδομένα τύπου **Student** τα οποία διαβάζουμε από το αρχείο students.txt. Θέλουμε να ταξινομήσουμε τα δεδομένα της λίστας κατά αύξουσα σειρά με δύο διαφορετικούς τρόπους α)με βάση τη σειρά επώνυμο/όνομα/ΑΕΜ και β) με βάση τη σειρά ΑΕΜ/επώνυμο/όνομα. Η ταξινόμηση των στοιχείων μίας λίστας μπορεί να γίνει με τη βοήθεια της στατικής μεθόδου [[https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator)|Collections.sort(java.util.List, java.util.Comparator)]], όπου παρέχεται ένας **συγκριτής** (//comparator//) για την σύγκριση των στοιχείων της λίστας. Η σύγκριση έχει υλοποιηθεί με δύο ανώνυμες κλάσεις που υλοποιούν και οι δύο το //interface// [[https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html|java.util.Comparator]]. +Στο παρακάτω παράδειγμα ορίζουμε την κλάση **Student** η οποία έχει τα τρία (3) πεδία **firstName**, **lastName**, **AEM**. Θέλουμε να ταξινομήσουμε τα δεδομένα της λίστας κατά αύξουσα σειρά με δύο διαφορετικούς τρόπους α) με βάση τη σειρά επώνυμο/όνομα/ΑΕΜ και β) με βάση τη σειρά ΑΕΜ/επώνυμο/όνομα. Η ταξινόμηση των στοιχείων μίας λίστας μπορεί να γίνει με τη βοήθεια της στατικής μεθόδου [[https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator)|Collections.sort(java.util.List, java.util.Comparator)]], όπου παρέχεται ένας **συγκριτής** (//comparator//) για την σύγκριση των στοιχείων της λίστας. Η σύγκριση έχει υλοποιηθεί με δύο ανώνυμες κλάσεις που υλοποιούν και οι δύο το //interface// [[https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html|java.util.Comparator]].
- +
-<code txt students.txt> +
-4596 Super Man +
-5819 Peter Pan +
-1694 Susan Brown +
-7895 Lena Smith +
-3256 Oscar Gonzales +
-1243 Edgar Wallace +
-3265 Kate Gordon +
-4377 Leda Evans +
-1118 David Lerroy +
-8744 Amelia Dray +
-</code>+
  
 <code java Student.java> <code java Student.java>
Line 48: Line 35:
      
   // First anonymous comparator class   // First anonymous comparator class
-  Comparator<Student> lexicographicCmp = new Comparator<Student>() {+  static Comparator<Student> lexicographicCmp = new Comparator<Student>() {
     public int compare(Student st1, Student st2) {     public int compare(Student st1, Student st2) {
       int cmp = st1.lastName.compareTo(st2.lastName);       int cmp = st1.lastName.compareTo(st2.lastName);
Line 56: Line 43:
         cmp = st1.AEM - st2.AEM;         cmp = st1.AEM - st2.AEM;
       return cmp;       return cmp;
-    } 
-    public boolean equals(Object o) { 
-      if(o instanceof Student) { 
-        Student st = (Student) o; 
-        if(firstName.equals(st.firstName) && lastName.equals(st.lastName) && AEM == st.AEM) 
-          return true; 
-      } 
-      return false; 
     }     }
   };   };
  
 +  public static void sortLexicographically(List<Student> students) {    
 +    Collections.sort(students, Student.lexicographicCmp);
 +  }
 +  
 +  public static void sortByAEM(List<Student> students) {
 +    // Second anonymous comparator class
 +    Collections.sort(students, new Comparator<Student>() {
 +        public int compare(Student st1, Student st2) {
 +          int cmp = st1.AEM - st2.AEM;
 +          if(cmp==0)
 +            cmp = st1.lastName.compareTo(st2.lastName);            
 +          if(cmp==0)
 +            cmp = st1.firstName.compareTo(st2.firstName);
 +          return cmp;
 +        }
 +      }
 +    );
 +  }
 +}
 +</code>
 +
 +Στη μέθοδο **//main//** διαβάζουμε από το αρχείο **students.txt** και καταχωρούμε το περιεχόμενο του σε μία λίστα (**ArrayList<Student>**). Στη συνέχεια εκτυπώνουμε τα στοιχεία της λίστας
 +  * με τη σειρά που τα διαβάσαμε
 +  * με λεξικογραφική σειρά.
 +  * με βάση το ΑΕΜ
 +
 +<code txt students.txt>
 +4596 Super Man
 +5819 Peter Pan
 +1694 Susan Brown
 +7895 Lena Smith
 +3256 Oscar Gonzales
 +1243 Edgar Wallace
 +3265 Kate Gordon
 +4377 Leda Evans
 +1118 David Lerroy
 +8744 Amelia Dray
 +</code>
 +
 +<code java SortListOfStudents.java>
 +import java.io.*;
 +import java.util.*;
 +
 +public class SortListOfStudents {
 +  
   public static void readFromFile(List<Student> students, File f) {       public static void readFromFile(List<Student> students, File f) {    
     try(Scanner sc = new Scanner(f)) {     try(Scanner sc = new Scanner(f)) {
Line 81: Line 105:
       System.exit(-1);       System.exit(-1);
     }     }
-  } 
-   
-  public void sortLexicographically(List<Student> students) {     
-    Collections.sort(students, lexicographicCmp); 
-  } 
-     
-  public void sortByAEM(List<Student> students) { 
-    // Second anonymous comparator class 
-    Collections.sort(students, new Comparator<Student>() { 
-        public int compare(Student st1, Student st2) { 
-          int cmp = cmp = st1.AEM - st2.AEM; 
-          if(cmp==0) 
-            cmp = st1.lastName.compareTo(st2.lastName);             
-          if(cmp==0) 
-            cmp = st1.firstName.compareTo(st2.firstName); 
-          return cmp; 
-        } 
-        public boolean equals(Object o) { 
-          if(o instanceof Student) { 
-            Student st = (Student) o; 
-            if(firstName.equals(st.firstName) && lastName.equals(st.lastName) && AEM == st.AEM) 
-              return true; 
-          } 
-          return false; 
-        } 
-      } 
-    ); 
   }   }
      
   public static String toString(List<Student> students) {   public static String toString(List<Student> students) {
-    StringBuffer str = new StringBuffer();+    StringBuilder str = new StringBuilder();
     for(Student st : students)      for(Student st : students) 
       str.append(st+"\n");       str.append(st+"\n");
Line 127: Line 124:
     System.out.println(" --- Init Ordering ---\n");     System.out.println(" --- Init Ordering ---\n");
     System.out.println(toString(students));     System.out.println(toString(students));
-    students.get(0).sortLexicographically(students);+    Student.sortLexicographically(students);
     System.out.println(" --- Lexicographic Ordering ---\n");     System.out.println(" --- Lexicographic Ordering ---\n");
     System.out.println(toString(students));     System.out.println(toString(students));
-    students.get(0).sortByAEM(students);+    Student.sortByAEM(students);
     System.out.println(" --- AEM Ordering ---\n");     System.out.println(" --- AEM Ordering ---\n");
     System.out.println(toString(students));     System.out.println(toString(students));
   }   }
-     
 } }
 </code> </code>
 +
  
 ===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως επέκταση υφιστάμενης κλάσης ===== ===== Παράδειγμα - Ανώνυμη εμφωλευμένη κλάση ως επέκταση υφιστάμενης κλάσης =====
Line 162: Line 159:
   }   }
      
-  abstract class BasicComparator implements Comparator<Student> { +  static abstract class BasicComparator implements Comparator<Student> {
-    public boolean equals(Object o) { +
-      if(o instanceof Student) { +
-        Student st = (Student) o; +
-        if(firstName.equals(st.firstName) && lastName.equals(st.lastName) && AEM == st.AEM) +
-          return true; +
-      } +
-      return false; +
-    }+
   }   }
          
-  Comparator<Student> lexicographicCmp = new BasicComparator() {+  static Comparator<Student> lexicographicCmp = new BasicComparator() {
     public int compare(Student st1, Student st2) {     public int compare(Student st1, Student st2) {
       int cmp = st1.lastName.compareTo(st2.lastName);       int cmp = st1.lastName.compareTo(st2.lastName);
Line 183: Line 172:
     }         }    
   };   };
- 
-  public static void readFromFile(List<Student> students, File f) {     
-    try(Scanner sc = new Scanner(f)) { 
-      while(sc.hasNextLine()) {         
-        students.add( new Student(sc.nextInt(), sc.next(), sc.next()) ); 
-      } 
-    } 
-    catch(FileNotFoundException ex) { 
-      System.out.println("File \""+f.getName()+"\" was not found!"); 
-    } 
-    catch(InputMismatchException ex) { 
-      System.out.println("Input mismatch while reading with scanner!!!"); 
-      ex.printStackTrace(); 
-      System.exit(-1); 
-    } 
-  } 
      
-  public void sortLexicographically(List<Student> students) {    +  public static void sortLexicographically(List<Student> students) {    
     Collections.sort(students, lexicographicCmp);     Collections.sort(students, lexicographicCmp);
   }   }
          
-  public void sortByAEM(List<Student> students) {+  public static void sortByAEM(List<Student> students) {
     Collections.sort(students, new BasicComparator() {     Collections.sort(students, new BasicComparator() {
         public int compare(Student st1, Student st2) {         public int compare(Student st1, Student st2) {
Line 216: Line 189:
       }       }
     );     );
-  } +  } 
-   +
-  public static String toString(List<Student> students) { +
-    StringBuffer str = new StringBuffer(); +
-    for(Student st : students)  +
-      str.append(st+"\n"); +
-    str.append("---------------------------------\n"); +
-    return str.toString(); +
-  } +
-   +
-  public static void main(String []args) { +
-    if(args.length == 0) { +
-      System.out.println("Insufficient number of arguments!\n"); +
-      return; +
-    } +
-    List<Student> students = new ArrayList<Student>(); +
-    readFromFile(students, new File(args[0])); +
-    System.out.println(" --- Init Ordering ---\n"); +
-    System.out.println(toString(students)); +
-    students.get(0).sortLexicographically(students); +
-    System.out.println(" --- Lexicographic Ordering ---\n"); +
-    System.out.println(toString(students)); +
-    students.get(0).sortByAEM(students); +
-    System.out.println(" --- AEM Ordering ---\n"); +
-    System.out.println(toString(students)); +
-  } +
-    +
 } }
 </code> </code>
Line 248: Line 195:
 ===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης ===== ===== Πρόσβαση στις τοπικές μεταβλητές και στις μεταβλητές της εξωτερικής κλάσης =====
  
-Σε αναλογία με τις [[java:local_inner_classes|τοπικές εμφωλευμένες κλάσεις]] οι ανώνυμες κλάσεις έχουν τις ίδιες δυνατότητες πρόσβασης στις τοπικές μεταβλήτές της μεθόδου στην οποία ορίζονται:+Σε αναλογία με τις [[java:local_inner_classes|τοπικές εμφωλευμένες κλάσεις]] οι ανώνυμες κλάσεις έχουν τις ίδιες δυνατότητες πρόσβασης στις τοπικές μεταβλητές της μεθόδου στην οποία ορίζονται:
   * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης.   * Η ανώνυμη κλάση έχει πρόσβαση στις μεταβλητές της εξωτερικής κλάσης.
-  * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζονται αν αυτές δεν έχουν δηλωθεί ως //final//.+  * Η ανώνυμη κλάση δεν μπορεί να έχει πρόσβαση σε τοπικές μεταβλητές της μεθόδου στην οποία ορίζεται αν αυτές δεν έχουν δηλωθεί ως //final//.
   * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "//κρύβει//" τον συγκεκριμένο τύπο δεδομένων από την εξωτερική κλάση.   * Όπως σε όλες τις μη στατικές εμφωλευμένες κλάσεις ο ορισμός του ίδιου τύπου δεδομένων στην εσωτερική και την εξωτερική κλάση "//κρύβει//" τον συγκεκριμένο τύπο δεδομένων από την εξωτερική κλάση.
   * __Δεν μπορείτε__ να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση.   * __Δεν μπορείτε__ να ορίσετε στατικές μεταβλητές ή μεθόδους μέσα σε μία ανώνυμη κλάση.
Line 256: Line 203:
 Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής: Σε μία ανώνυμη κλάση μπορείτε να ορίσετε τα εξής:
   * Πεδία   * Πεδία
-  * Επιπλέον μεθόδους που δεν ορίζονται στη interface ή στην κλάση που επεκτείνεται.+  * Επιπλέον μεθόδους που δεν ορίζονται στο interface ή στην κλάση που επεκτείνεται.
   * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση.   * Τοπικές κλάσεις που ανήκουν στη ανώνυμη κλάση.
   * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση.   * **ΔΕΝ** μπορείτε και __δεν έχει νόημα__ να ορίσετε κατασκευαστές μέσα σε μία ανώνυμη κλάση.
  
 | Προηγούμενο : [[ :java:local_inner_classes | Τοπικές εμφωλευμένες κλάσεις   ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:static_nested_classes | Στατικές εμφωλευμένες κλάσεις  ]]  | | Προηγούμενο : [[ :java:local_inner_classes | Τοπικές εμφωλευμένες κλάσεις   ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ :java:static_nested_classes | Στατικές εμφωλευμένες κλάσεις  ]]  |
java/anon_inner_classes.1521626322.txt.gz · Last modified: 2018/03/21 09:58 by gthanos