Внутренние классы хороши для представления объектов, которые должны быть частными или каким-либо образом тесно связанными с классом включения. Иногда существуют технические причины для использования внутренних классов (например, имитация замыканий). Они также сокращают загрязнение пространства имен.
Одним из недостатков внутренних классов является то, что если они обращаются к закрытым членам (полям или функциям) включающего класса, компилятор сгенерирует функции доступа для этих членов. Языковые пуристы будут спорить, является ли это нарушение инкапсуляции хорошим или плохим. Функции доступа добавляют немного накладных расходов к каждому доступу (что обычно не является фактором, но это так). Другим недостатком является то, что он делает исходный файл более сложным и, следовательно, сложнее в управлении. (Меня иногда ужалило, когда я редактировал функцию во внутреннем классе, думая, что она была во внешнем классе, и наоборот.) Наконец, внутренние классы, как правило, не пригодны для повторного использования, в то время как отдельные классы часто могут параметризоваться для многократного использования .
Эти плюсы и минусы не в моей голове. Я уверен, что у других возникнут дополнительные мысли.
ОБНОВЛЕНИЕ:
В этом Google IO видео внутренняя опция AsyncTask явно помечена как неправильная.