No me molestaré en parafrasear, porque Google puede explicarlo mejor.
Suponiendo: Clase de los padres es Foo
y clase interna es Foo$Inner
:
El problema es que la máquina virtual considera que el acceso directo a los miembros privados de Foo de Foo $ Interno ser ilegal porque Foo y Foo $ Interior distintas clases, aunque el lenguaje Java permite que una clase interna acceda a miembros privados de una clase externa. Para cerrar la brecha, el compilador genera un par de métodos sintéticos:
/*package*/ static int Foo.access$100(Foo foo) {
return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
foo.doStuff(value);
}
El código de clase interna llama a estos métodos estáticos cada vez que necesita para acceder al campo mvalue o invocar el método hacerTarea en la clase externa. Lo que esto significa es que el código anterior realmente se reduce a un caso en el que está accediendo a los campos de miembros a través de métodos de acceso. Anteriormente hablamos sobre cómo los accessors son más lentos que los accesos directos a los campos, por lo que este es un ejemplo de un idioma determinado que resulta en un golpe de desempeño "invisible".
Si está utilizando un código como este en un punto de acceso de alto rendimiento, puede evitar la sobrecarga declarando campos y métodos a los que acceden las clases internas para tener acceso a paquetes, en lugar de acceso privado. Desafortunadamente, esto significa que se puede acceder directamente a los campos por otras clases en el mismo paquete, por lo que no debe usar esto en la API pública.
Fuente: https://developer.android.com/training/articles/perf-tips.html#PackageInner
¿Dónde se lee clases internas no estáticos no se recomiendan en Android? – Cristian
Esto no es solo un problema de Android. Para el código intercambiable y rápido, debe evitarlos, excepto que son estáticos y almacenan la información que requieren como campos locales. El problema con las clases internas es que no puede establecer la referencia a la clase padre a 'null' para obtener el valor GC. El compilador debe generar métodos de acceso si los miembros de la clase padre que el acceso a la clase interna son privados y usted tiene una clase interna por instancia de clase principal. – Stephan
@Cristian desplácese hasta la parte inferior de este enlace http://developer.android.com/resources/articles/avoiding-memory-leaks.html debe evitarse si no puede controlar el ciclo de vida de la clase interna. – OckhamsRazor