Анонимный внутренний класс может оказаться полезным при создании экземпляра объекта с определенными "дополнениями", такими как переопределяющие методы, без необходимости фактического создания подкласса класса.
Я обычно использую это как ярлык для подключения прослушивателя событий:
Использование этого метода немного ускоряет кодирование, поскольку мне не нужно создавать дополнительный класс, который реализует ActionListener - я могу просто создать экземпляр анонимного внутреннего класса, фактически не создавая отдельный класс.
Я использую этот метод только для "быстрых и грязных" задач, когда создание целого класса кажется ненужным. Наличие нескольких анонимных внутренних классов, которые выполняют в точности одно и то же, должно быть реорганизовано в реальный класс, будь то внутренний класс или отдельный класс.
Ответ 2
Анонимные внутренние классы фактически являются замыканиями, поэтому их можно использовать для эмуляции лямбда-выражений или "делегатов". Например, возьмем этот интерфейс:
publicinterfaceF<A, B> { B f(A a); }
Вы можете использовать это анонимно для создания первоклассной функции в Java. Допустим, у вас есть следующий метод, который возвращает первое число, большее i в данном списке, или i, если ни одно число не больше:
publicstaticintlarger(final List<Integer> ns, finalint i) { for (Integer n : ns) if (n > i) return n; return i; }
И тогда у вас есть другой метод, который возвращает первое число, меньшее, чем i в данном списке, или i, если ни одно число не меньше:
publicstaticintsmaller(final List<Integer> ns, finalint i) { for (Integer n : ns) if (n < i) return n; return i; }
Эти методы практически идентичны. Используя первоклассную функцию типа F, мы можем переписать их в один метод следующим образом:
publicstatic <T> T firstMatch(final List<T> ts, final F<T, Boolean> f, T z) { for (T t : ts) if (f.f(t)) return t; return z; }
Вы можете использовать анонимный класс для использования метода firstMatch:
This is a really contrived example, but its easy to see that being able to pass functions around as if they were values is a pretty useful feature. See "Can Your Programming Language Do This" by Joel himself.
A nice library for programming Java in this style: Functional Java.
Ответ 3
Анонимный внутренний класс используется в следующем сценарии:
1.) Для переопределения (подклассов), когда определение класса невозможно использовать, за исключением текущего случая:
Иногда я использую их как синтаксический взлом для создания экземпляра Map:
Mapmap=newHashMap() {{ put("key", "value"); }};
против
Mapmap=newHashMap(); map.put("key", "value");
Это экономит некоторую избыточность при выполнении большого количества инструкций put . Однако я также сталкивался с проблемами при выполнении этого, когда внешний класс необходимо сериализовать с помощью удаленного взаимодействия.