User Tools

Site Tools


java:local_inner_classes

Τοπικές κλάσεις

Μπορείτε να ορίσετε μία κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκιστρα ενός if statement ή μέσα στο σώμα μία εντολής ανακύκλωσης for() ή while(). Η συγκεκριμένη κατηγορία κλάσεων ονομάζεται τοπικη κλάση.

Ο λόγος που πιθανόν θέλει κάποιος προγραμματιστής να ορίσει μία τοπική κλάση είναι ότι η λειτουργικότητα που υλοποιεί η τοπική κλάση αφορά μόνο τη συγκεκριμένη μέθοδο μέσα στην οποία δηλώνεται.

Δείτε το παρακάτω παράδειγμα κώδικα.

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");
  }
}

Πρόσβαση στα μέλη της εξωτερικής κλάσης από την τοπική κλάση

Μία τοπική κλάση έχει πρόσβαση στα μέλη της εξωτερικής κλάσης. Στο προηγούμενο παράδειγμα, παρατηρήστε πως ο κατασκευαστής της κλάσης PhoneNumber έχει πρόσβαση στην μεταβλητή LocalClassExample.regularExpression.

Πρόσβαση στις τοπικές μεταβλητές της μεθόδου

Μία τοπική κλάση έχει πρόσβαση στις τοπικές μεταβλητές της μεθόδου μέσα στην οποία συνήθως ορίζεται μόνο αν αυτές έχουν οριστεί ως final. Δηλώνοντας μία μεταβλητή ως final δηλώνουμε ότι η τιμή αυτή δεν πρόκειται και δεν μπορεί να αλλάξει. Για παράδειγμα η μεταβλητή numberLength δηλώνεται final

final int numberLength = 10;

Αν προσθέσετε τους προσδιοριστές final στις παραμέτρους phoneNumber1 και phoneNumber2 τότε θα μπορείτε να εισάγετε την μέθοδο printOriginalNumbers οι οποία χρησιμοποιεί τις μεταβλητές αυτές.

Στην Java 8 και μεταγενέστερα εισάγεται η έννοια της effectively final μεταβλητής. Ως effectively final ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της. Ο μεταγλωττιστής είναι αρκετά “έξυπνος” για να αντιληφθεί ότι η τιμή της μεταβλητής δεν μεταβάλλεται ακόμη και εάν δεν οριστεί ως final.

java/local_inner_classes.txt · Last modified: 2021/04/12 04:54 (external edit)