Veo un montón de código java donde android prefiere tener a los desarrolladores el uso de las clases internas estáticas. En particular para los patrones como el Patrón ViewHolder en la costumbre de ListAdapters.

No estoy seguro de cuáles son las diferencias entre los estáticos y no estáticos de clases. He leído sobre él, pero no parece tener sentido cuando se trata de rendimiento o de la memoria de la huella.

5 Comentarios

  1. 68

    No sólo los desarrolladores de Android…

    Una no-clase interna estática siempre mantiene una referencia implícita a la envolvente del objeto. Si usted no necesita de referencia, lo único que hace es el costo de la memoria. Considere esto:

    class Outer {
        class NonStaticInner {}
        static class StaticInner {}
        public List<Object> foo(){ 
            return Arrays.asList(
                new NonStaticInner(),
                new StaticInner()); 
        }
    }

    Cuando se compila, lo que se obtiene será algo como esto:

    class Outer {
        Outer(){}
        public List<Object> foo(){ 
            return Arrays.asList(
                new Outer$NonStaticInner(this),
                new StaticInner()); 
        }
    }
    class Outer$NonStaticInner {
        private final Outer this$0;
        Outer$NonStaticInner(Outer enclosing) { this$0 = enclosing; }
    }
    class Outer$StaticInner {
        Outer$StaticInner(){}
    }
    • Eso es cierto, pero hay más – a veces usted no tiene una referencia a la clase exterior y todavía quieres crear una instancia de la parte interior (si es visible).
    • +1 para la impresión de lo que el compilador va a hacer fuera de la fuente de entrada
    • No puede un no-clase interna estática declarar explícitamente una referencia a la exterior (sólo manual de instancia), dando lo mejor de ambos mundos: el exterior de referencia sin memoria estática de los costos ? También, el ins no una clase interna estática no reentrante, por lo tanto, ser útil sólo en el caso de que una sola instancia de que se requiere ?
  2. 25

    La principal diferencia entre estáticos y no estáticos interior de las clases es que una no-clase interna estática tiene acceso a los otros miembros de la clase exterior, incluso si son de carácter privado. No estática de las clases internas son una «parte» de la clase exterior. Usted no puede crear ni pueden existir sin una instancia de una clase exterior. Una consecuencia de esto es que una instancia de un no-estática de las clases internas son destruidos cuando el exterior de la clase de la instancia es destruido.

    Interna estática de las clases, por otro lado, son como normal exterior de clases. El vivir y morir por su propia cuenta. Usted no necesita una instancia de la clase exterior para el interior de la clase de existir. Eso significa que ellos también tienen su propio ciclo de vida. Que se destruye cuando el recolector de basura decide destruirlos.

    ¿Cómo afecta esto a la memoria y/o rendimiento? La verdad, no sé. 🙂

    • «¿Cómo afecta esto a la memoria y/o el rendimiento?» Va a prevenir la pérdida de memoria. Tener una clase interna estática evitar hacer una referencia a la Actividad / Fragmento, ya que la clase interna estática no puede exterior de acceso miembro de la variable. Si tenemos una fuga de memoria en la Actividad, y que la Actividad de mantener una referencia de muchos objetos pesados (como las Vistas), se consumen memoria innecesarios y disminuir el rendimiento.
  3. 15

    Interna estática de las clases (es decir, las clases declaradas dentro de otra clase con la palabra clave static) son bastante similares a «normal» de clases, excepto que usted no contaminar su nombre del paquete de espacio. Que es su (único) de la diferencia y de beneficio y creo que esa es la razón por la que vemos en Android.

    El uso de las clases internas estáticas cuando el propósito de la clase es apretar a la clase principal, pero no depende de sus instancias. Esto es generalmente considerado como una buena práctica.

    • Puede usted entrar en más detalles respecto a la clase interna estática y lo que constituye una clase interna? Esto es intrigante
  4. 7

    No clase interna estática instancia contiene una referencia a la clase exterior instancia, mientras que una clase interna estática instancia no.

    Esto es relevante para las aplicaciones en la memoria como la referencia oculta puede conducir a pérdidas de memoria – el recolector de basura no puede cobrar el exterior de la instancia de la clase hasta que no hay más referencias que existen. También la referencia adicional sí mismo las necesidades de memoria, esto puede ser relevante si un alto número de casos en que se utilizan.

    class Outer{
        class Inner{//Only works with non static inner class
              public Outer getOuter(){return Outer.this;}
        }
    }

    También es pertinente para su uso, la referencia a la clase exterior es un cto r argumento de la clase interna, para crear una nueva clase interna estática objeto, tiene que llamar al cto r como un memberfunction en una instancia de la clase exterior o desde dentro de un memberfunction de la clase exterior. Esto significa que usted no puede tener una instancia de la clase interna sin una instancia de la clase exterior.

    Outer.Inner in = new Outer().new Inner();
    • buen trabajo de mencionar la pérdida de memoria
  5. 5

    Si descompilar una clase interna (o reloj usando el depurador) se puede ver que no se genera código para acceder a la instancia de la clase exterior que se utilizó para crearlos. La sobrecarga que esto es más de memoria para el puntero adicional, más de la cpu para la recolección de basura, porque de puntero adicional a la prueba, y si quieres nit de selección, más tiempo de compilación. La creación de instancias de no estática interior de las clases es un poco más complicado porque se necesita una instancia de la clase exterior para crear ellos.

    Visibilidad de estáticos y no estáticos de las clases internas pueden ser controlados. Generalmente son privados si su aplicación está fuertemente connnected a los detalles internos de la clase exterior, y el desarrollador no creo que el código se puede reutilizar. En este sentido, ellos no son mejores que los privados de funciones. Las clases internas pueden ser públicas, en casos como el Mapa.De entrada, donde la clase interna está fuertemente conectada a la interfaz expuesta por la clase, y el desarrollador no creo que ese Mapa.La entrada puede ser utilizado sin algún tipo de Mapa. Ambos tipos tienen acceso a los miembros privados de la clase exterior y el exterior de la clase tiene acceso a los miembros privados de la clase interna.

    Instancias de estáticos y no estáticos de las clases internas son basura que se recoge como todos los demás de la clase. No hay ninguna conexión especial entre el grabage colección de la clase exterior y la recolección de elementos de la clase interna.

    En el caso de la interfaz de usuario de clases de la aplicación como el swing o android podrás ver las clases internas estáticas porque son tratados como función privada. Estas clases no están desarrollados para facilitar la reutilización fuera de la clase exterior y está fuertemente conectado con la implementación interna de la clase exterior. No hay ninguna razón para exponerlos y para asegurarse de que puede trabajar en más casos que en el contexto específico de los exteriores de los requisitos de la clase.

Dejar respuesta

Please enter your comment!
Please enter your name here