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