Les classes internes sont bonnes pour la représentation des objets qui sont destinés à être privé ou d'une certaine façon intimement liée à la classe englobante. Il y a parfois des raisons techniques pour l'utilisation des classes internes (par exemple, la simulation de fermetures). Ils ont aussi coupé vers le bas sur la pollution de l'espace de noms.
Un désavantage de l'intérieur des classes, c'est que si ils ont accès privé membres (champs ou fonctions) de la classe englobante, le compilateur va générer des fonctions d'accesseur à ces membres. Langue les puristes diront si cette rupture de l'encapsulation est une Bonne Chose ou une Mauvaise Chose. Les fonctions d'accès à ajouter un peu de surcharge pour chaque accès (ce qui n'est généralement pas un facteur, mais il est là). Un autre inconvénient est que cela rend le fichier source plus complexe et donc plus difficile à gérer. (J'ai parfois été piqué par une modification d'une fonction à l'intérieur de la classe tout en pensant que c'était à l'extérieur de la classe, et vice-versa.) Enfin, les classes internes ont tendance à ne pas être réutilisable, tandis que les classes séparées peuvent souvent être paramétré pour avoir de multiples utilisations.
Ces avantages et inconvénients sont sur le dessus de ma tête. Je suis sûr que d'autres ont d'autres pensées.
Mise à JOUR:
Dans ce Google IO vidéo de l'intérieur AsyncTask option est clairement identifié comme étant mauvaise option.