java:local_inner_classes

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
java:local_inner_classes [2021/04/12 04:54]
java:local_inner_classes [2021/04/12 05:54]
gthanos [Τοπικές κλάσεις]
Line 1: Line 1:
 +====== Τοπικές κλάσεις ======
  
 +
 +Μπορείτε να ορίσετε μία κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκιστρα ενός //if// statement ή μέσα στο σώμα μία εντολής ανακύκλωσης //for()// ή //while()//. Η συγκεκριμένη κατηγορία κλάσεων ονομάζεται **τοπικη κλάση**. 
 +
 +Ο λόγος που πιθανόν θέλει κάποιος προγραμματιστής να ορίσει μία τοπική κλάση είναι ότι η λειτουργικότητα που υλοποιεί η τοπική κλάση αφορά μόνο τη συγκεκριμένη μέθοδο μέσα στην οποία δηλώνεται. 
 +
 +Δείτε το παρακάτω παράδειγμα κώδικα.
 +
 +<code java ValidatePhoneNumberUsingLocalClass.java> 
 + 
 +public class ValidatePhoneNumberUsingLocalClass {
 +  
 +  static String regularExpression = "[^0-9]";
 +  
 +  public static void validatePhoneNumber(String number) {
 +    
 +    final int numberLength = 10;
 +     
 +    class PhoneNumber {
 +      
 +      private String formattedPhoneNumber = null;
 +
 +      PhoneNumber(String phoneNumber){        
 +        regularExpression = "[^0-9]";
 +        String currentNumber = phoneNumber.replaceAll(
 +          regularExpression, "");
 +        if (currentNumber.length() == numberLength)
 +          formattedPhoneNumber = currentNumber;
 +        else
 +          formattedPhoneNumber = null;
 +      }
 +
 +      public String getNumber() {
 +        return formattedPhoneNumber;
 +      }
 +      
 +      public String toString() {
 +        if(formattedPhoneNumber == null)
 +          return "Invalid number\n";
 +        else
 +          return formattedPhoneNumber;
 +      }
 +      
 +      //    public void printOriginalNumbers() {
 +      //      System.out.println("Original numbers are " + phoneNumber1 +
 +      //          " and " + phoneNumber2);
 +      //    }
 +    }
 +
 +    //  myNumber1.printOriginalNumbers();
 +    System.out.println(number + ": " + new PhoneNumber(number));
 +  }
 +
 +  public static void main(String... args) {
 +    ValidatePhoneNumberUsingLocalClass.validatePhoneNumber("123-456-7890");
 +    ValidatePhoneNumberUsingLocalClass.validatePhoneNumber("456-7890");
 +  }
 +}
 +</code>
 +===== Πρόσβαση στα μέλη της εξωτερικής κλάσης από την τοπική κλάση =====
 +
 +Μία τοπική κλάση έχει πρόσβαση στα μέλη της εξωτερικής κλάσης. Στο προηγούμενο παράδειγμα, παρατηρήστε πως ο κατασκευαστής της κλάσης //PhoneNumber// έχει πρόσβαση στην μεταβλητή //**LocalClassExample.regularExpression**//.
 +
 +===== Πρόσβαση στις τοπικές μεταβλητές της μεθόδου =====
 +
 +Μία τοπική κλάση έχει πρόσβαση στις τοπικές μεταβλητές της μεθόδου μέσα στην οποία συνήθως ορίζεται μόνο αν αυτές έχουν οριστεί ως //final//. Δηλώνοντας μία μεταβλητή ως //final// δηλώνουμε ότι η τιμή αυτή δεν πρόκειται και δεν μπορεί να αλλάξει. Για παράδειγμα η μεταβλητή numberLength δηλώνεται //final// 
 +<code java>
 +final int numberLength = 10;
 +</code>
 +
 +Αν προσθέσετε τους προσδιοριστές //final// στις παραμέτρους //**phoneNumber1**// και //**phoneNumber2**// τότε θα μπορείτε να εισάγετε την μέθοδο //**printOriginalNumbers**// οι οποία χρησιμοποιεί τις μεταβλητές αυτές.
 +
 +<WRAP tip 80% center round>
 +Στην **Java 8** και μεταγενέστερα εισάγεται η έννοια της //effectively final// μεταβλητής. Ως //effectively final// ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. Ο μεταγλωττιστής είναι αρκετά "έξυπνος" για να αντιληφθεί ότι η τιμή της μεταβλητής δεν μεταβάλλεται ακόμη και εάν δεν οριστεί ως //final//.
 +</WRAP>
 +
 +|Προηγούμενο: [[ :java:inner_class_inheritance | Κληρονομικότητα εσωτερικών κλάσεων  ]] | Επόμενο: [[ :java:anon_inner_classes | Ανώνυμες εμφωλευμένες κλάσεις ]]|
java/local_inner_classes.txt · Last modified: 2021/04/12 04:54 (external edit)