Локальные классы — классы внутри методов - 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(new PoliceCar(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.

— То, что можно использовать переменные метода – это действительно классная штука. Надеюсь, я оценю ее по достоинству. Плохо только, что нельзя менять переменные.

— Почему их нельзя менять, тебе сегодня расскажет Элли, а я пойду пока часок вздремну.

— Спокойной ночи, Ким. Спасибо за интересный урок.