Skip to main content

Что такое анонимный внутренний класс?

В объектно-ориентированном компьютерном программировании анонимный внутренний класс - это класс, который объявлен внутри метода, но не назван. У анонимного внутреннего класса есть несколько ограничений, которые отличают его от обычного класса, включая ограничение на область действия переменных, к которым он может обращаться. Существуют очень специфические ситуации, в которых использование анонимного внутреннего класса может сделать исходный код более читабельным, но в первую очередь он используется для обеспечения инкапсуляции, когда генерация отдельных классов может усложнить ее.

Инкапсуляция - это концепция объектно-ориентированного программирования (ООП), согласно которой объект и его компоненты должны быть каким-то образом защищены и привязаны к объекту. Анонимные внутренние классы и внутренние классы в целом помогают реализовать инкапсуляцию для особенно сложных объектов. Вместо того чтобы создавать класс, который опирается на отдельный внешний класс, искусственно связывая их вместе и потенциально выставляя некоторые компоненты, анонимный внутренний класс может прочно связать их вместе.

В некоторых языках программирования анонимный внутренний класс может помочь преодолеть ограничения одиночного наследования. Если объект наследует от одного класса, но затем ему нужен доступ к другому, внутренний класс может быть сгенерирован на лету и затем передан соответствующим обработчикам. Эта методика обычна для обратных вызовов и слушателей событий. Единственная альтернатива - создать целый второй класс, в котором будут переопределены только один или два метода.

У анонимных внутренних классов есть некоторые ограничения, чтобы предотвратить нарушение инкапсуляции и обеспечить область действия. Основное ограничение заключается в том, что анонимный внутренний класс не может получить доступ к переменным метода, в котором он находится, если эти переменные не объявлены как final. Это связано с тем, что внутренний класс может продолжать функционировать за пределами жизни класса и метода, в котором он находится. Переменные класса обертки будут уничтожены, как только закончится его жизнь, поэтому ссылки, содержащиеся в внутреннем классе, станут мгновенно недействительными. Единственным исключением из этого является окончательная переменная, потому что она будет существовать за пределами экземпляра.

Одним из более конкретных применений анонимного внутреннего класса является защита кода. Во многих языках ООП предусмотрен механизм, называемый отражением. Reflection позволяет программе анализировать другой класс и видеть, каковы его переменные-члены и методы, но не сам код. Используя анонимный внутренний класс, содержимое внутреннего класса защищено от рефлексии, и внутренняя работа большего класса может быть эффективно скрыта.