— Привіт, Аміго!
Ще одна невелика тема – це локальні класи.
Як ти вже бачив, класи можна створювати не лише в окремих файлах, а й усередині інших класів. Так ось це ще не все. Класи можна створювати й усередині методів. Такі класи називають локальними. Вони працюють як звичайні внутрішні класи, але їх можна використовувати в межах методу, де їх оголосили.
Увага на екрані:
class Car{
public ArrayList<Car> createPoliceCars(int count) { ArrayList<Car> result = new ArrayList<Car>();
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<Car> createPoliceCars(int count) { ArrayList<Car> result = new ArrayList<Car>(); 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.
— Те, що можна використовувати змінні методи – це справді класна штука. Сподіваюся, я гідно оціню її. Погано тільки, що не можна змінювати змінні.
— Чому їх не можна міняти, тобі сьогодні розповість Еллі, а я піду, поки годинку подрімну.
— На добраніч, Кім. Дякую за цікавий урок.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ