Las clases locales son clases que se definen en un bloque , que es un grupo de cero o más declaraciones entre llaves equilibradas. Por lo general, se encuentran clases locales definidas en el cuerpo de un método
public class LocalClassExample {
static String regularExpression = "[^0-9]";
public static void validatePhoneNumber(String phoneNumber1, String phoneNumber2) {
final int numberLength = 10;
// Valid in JDK 8 and later:
// int numberLength = 10;
class PhoneNumber {
String formattedPhoneNumber = null;
PhoneNumber(String phoneNumber) {
// numberLength = 7;
String currentNumber = phoneNumber.replaceAll(regularExpression, "");
if (currentNumber.length() == numberLength) {
formattedPhoneNumber = currentNumber;
} else {
formattedPhoneNumber = null;
}
}
public String getNumber() {
return formattedPhoneNumber;
}
// Valid in JDK 8 and later:
// public void printOriginalNumbers() {
// System.out.println("Original numbers are " + phoneNumber1 +
// " and " + phoneNumber2);
// }
}
PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1);
PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2);
// Valid in JDK 8 and later:
// 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) {
validatePhoneNumber("123-456-7890", "456-7890");
}
}
Una clase local tiene acceso a los miembros de su clase adjunta. En el ejemplo anterior, el PhoneNumberconstructor accede al miembro LocalClassExample.regularExpression.
Además, una clase local tiene acceso a variables locales. Sin embargo, una clase local solo puede acceder a las variables locales que se declaran definitivas. Cuando una clase local accede a una variable local o parámetro del bloque adjunto, captura esa variable o parámetro. Por ejemplo, el PhoneNumberconstructor puede acceder a la variable local numberLengthporque se declara final; numberLengthes una variable de capturado .
Sin embargo, comenzando en Java SE 8, una clase local puede acceder a variables y parámetros locales del bloque adjunto que son finales o efectivamente finales . Una variable o parámetro cuyo valor nunca se cambia después de que se inicializa es efectivamente final