enrique-j
8/30/2018 - 5:59 PM

Clases locales

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

Declarando clases locales

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

Acceder a los miembros de una clase adjunta

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