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