Локальні класи — класи всередині методів - 1

— Привіт, Аміго!

Ще одна невелика тема – це локальні класи.

Як ти вже бачив, класи можна створювати не лише в окремих файлах, а й усередині інших класів. Так ось це ще не все. Класи можна створювати й усередині методів. Такі класи називають локальними. Вони працюють як звичайні внутрішні класи, але їх можна використовувати в межах методу, де їх оголосили.

Увага на екрані:

Приклад
class Car{

public ArrayList&ltCar> createPoliceCars(int count) {

    ArrayList&ltCar> result = new ArrayList&ltCar>();

    class PoliceCar extends Car {

    int policeNumber;
    PoliceCar(int policeNumber) {

    this.policeNumber = policeNumber;
    }

    }

    for(int i=0; i<count; i++)
    result.add(newPoliceCar(i));
    return result;
}
}

— А навіщо такі класи потрібні?

Клас усередині методу, та ще з методами та конструкторами – це код, що дуже погано читається, хіба не так?

— Саме так. Ти абсолютно правий.

У методах можна використовувати анонімні внутрішні класи. Але є одна маленька перевага у таких класів, через що їх досить часто використовують усередині методів.

Клас, оголошений усередині методу, може використовувати локальні змінні цього методу:

class Car {

public ArrayList&ltCar> createPoliceCars(int count) {

    ArrayList&ltCar> result = new ArrayList&ltCar>();

    for(int i=0; i<count; i++) {

    final int number = i;
    result.add(new Car() {

    int policeNumber = number;
    });

    }
    return result;
 }
}

Але є одне обмеження – змінні можна лише «читати», змінювати їх не можна.

Тому класи, оголошені всередині методу, можуть мати доступ тільки до тих змінних методів, які позначені ключовим словом final. У прикладі вище ти можеш бачити, що я не можу відразу присвоїти змінній policeNumber значення змінної i, а спочатку зберігаю його в final-змінну number.

— Те, що можна використовувати змінні методи – це справді класна штука. Сподіваюся, я гідно оціню її. Погано тільки, що не можна змінювати змінні.

— Чому їх не можна міняти, тобі сьогодні розповість Еллі, а я піду, поки годинку подрімну.

— На добраніч, Кім. Дякую за цікавий урок.