====== Τοπικές κλάσεις ====== Μπορείτε να ορίσετε μία κλάση μέσα σε οποιοδήποτε μπλοκ κώδικα, δηλαδή μέσα στο σώμα μίας μεθόδου μέσα σε στα άγκιστρα ενός //if// statement ή μέσα στο σώμα μία εντολής ανακύκλωσης //for()// ή //while()//. Η συγκεκριμένη κατηγορία κλάσεων ονομάζεται **τοπικη κλάση**. Ο λόγος που πιθανόν θέλει κάποιος προγραμματιστής να ορίσει μία τοπική κλάση είναι ότι η λειτουργικότητα που υλοποιεί η τοπική κλάση αφορά μόνο τη συγκεκριμένη μέθοδο μέσα στην οποία δηλώνεται. Δείτε το παρακάτω παράδειγμα κώδικα. 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:inner_class_inheritance | Κληρονομικότητα εσωτερικών κλάσεων ]] | Επόμενο: [[ :java:anon_inner_classes | Ανώνυμες εμφωλευμένες κλάσεις ]]|