java:local_inner_classes

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

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

LocalClassExample.java
public class LocalClassExample {
 
  String regularExpression = "[^0-9]";
 
  public void validatePhoneNumber(/*final*/ String phoneNumber1,/*final*/ String phoneNumber2) {
 
    final int numberLength = 10;
 
    class PhoneNumber {
 
      String formattedPhoneNumber = null;
 
      PhoneNumber(String phoneNumber){        
        regularExpression = "[^0-9]";
        // numberLength = 7;
        String currentNumber = (phoneNumber).replaceAll(
          regularExpression, "");
        if (currentNumber.length() == numberLength)
          formattedPhoneNumber = currentNumber;
        else
          formattedPhoneNumber = null;
      }
 
      public String getNumber() {
        return formattedPhoneNumber;
      }
 
//    public void printOriginalNumbers() {
//      System.out.println("Original numbers are " + phoneNumber1 +
//          " and " + phoneNumber2);
//    }      
    }
 
    PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1);
    PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2);
 
//  myNumber1.printOriginalNumbers();
 
    if (myNumber1.getNumber() == null) 
      System.out.println("First number is invalid");
    else
      System.out.println("First number is " + myNumber1.getNumber());
    if (myNumber2.getNumber() == null)
      System.out.println("Second number is invalid");
    else
      System.out.println("Second number is " + myNumber2.getNumber());
 
  }
 
  public static void main(String... args) {
    LocalClassExample lce = new LocalClassExample();
    lce.validatePhoneNumber("123-456-7890", "456-7890");
  }
}

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

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

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

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

final int numberLength = 10;

Αν βγάλετε τα σχόλια από την γραμμή 15 numberLength = 7;, θα παρατηρήσετε ότι λαμβάνετε το παρακάτω μήνυμα λάθους:

LocalClassExample.java:15: error: cannot assign a value to final variable numberLength
        numberLength = 7;

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

Στην Java 8 ή μεταγενέστερα εισάγεται η έννοια της effectively final μεταβλητής. Ως effectively final ορίζεται κάθε τοπική μεταβλητή της οποίας η τιμή δεν μεταβάλλεται μετά την αρχικοποίηση της.

java/local_inner_classes.txt · Last modified: 2016/02/26 11:15 (external edit)