2011-02-28 18 views
6

consideran este (anónimo):¿Cuáles son las ventajas de la clase interna anónima (en comparación con la clase interna no anónima)?

speakBtn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null); 
    }}); 

frente a esto: (no anónimo):

class MyOuterClass { 
    private class MyOnClickListener implements OnClickListener { 
     @Override 
     public void onClick(View view) { 
      mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null); 
     } 
    } 

    // later (inside some method)... 
     speakBtn.setOnClickListener(new MyOnClickListener()); 
} 

Excepto por el menor número de líneas, ¿hay alguna otra ventaja de la forma anónima?

¿Hay una ventaja de rendimiento?

+0

¿La sintaxis de la clase interna anónima no es lo suficientemente detallada para usted? –

Respuesta

3

La clase interna anónima tiene ventaja sobre la clase interna (como en el código de ejemplo de pregunta) ya que cierra las variables locales del método (aunque solo se pueden usar final locales).

En general, una clase interna se puede convertir fácilmente en un método con clase interna anónima, lo que ayuda a reducir la verbosidad. Si tiene una clase interna que es tan grande que desea que no sea local, es posible que desee pensar en luchar con su IDE para ponerlo en un nuevo archivo como una clase externa.

(El es también clases locales, que son las clases internas denominadas normales definidos dentro de un método y que se cierran sobre los locales.)

+0

¿Puede explicar lo que quiere decir con "cierra"? Gracias. – an00b

+0

@ an00b No muy bien. Aquí hay un enlace: http://en.wikipedia.org/wiki/Closure_(computer_programming) –

+0

¡Guau! Muchas gracias. Acabas de hacer que tu respuesta sea la aceptada (a pesar de que muchas otras respuestas también son muy buenas). Ahora aprenderé cuáles son las funciones de primera clase, y luego aprenderé qué es el cierre. – an00b

1

La ventaja es el tiempo que ahorra como desarrollador por no tener que escribir las teclas adicionales. :)

Ah, y también le impide tener que encontrar un nuevo nombre para todo (que en algunos casos puede causar colisiones de nombres).

+0

Gracias. Ya lo dije en mi pregunta "Excepto por la menor cantidad de líneas", por lo que incluye "no escribir las teclas adicionales". :) Las consideraciones del espacio de nombres son definitivamente una ventaja adicional. – an00b

+0

@ an00b: Sí, me di cuenta de eso, pero es una ventaja tan importante y realmente hay tan pocas otras ventajas que vale la pena mencionar. :) – Mehrdad

1

Hay una desventaja de que salga hacia fuera:

Si necesita más de uno de la misma clase interna, que bastante tienen que utilizar una clase definida de manera explícita. Por lo que describes, no, no necesitas uno. Pero puede decidir en una fecha posterior que necesita otro objeto que tenga la misma funcionalidad, pero es un objeto diferente.

2

La ventaja de no anónimo es que puede reutilizar la clase. Creo que la única razón para usar una clase interna anónima es la brevedad.

+2

Por el contrario, a veces desea que la fuente deje en claro que un determinado bit de código no es para uso general, sino solo en el sitio de declaración. Una clase anónima hace esto. –

+1

Puedes hacer esto también con una clase interna 'privada '. –

2

Las cosas que me gusta de las clases internas con nombre:

  • Tienen un nombre. Me resulta más fácil depurar cuando veo MyOuterClass$MyOnClickListener en un seguimiento de pila en lugar de MyOuterClass$1, que es lo que obtienes con una clase interna anónima.
  • A veces ayuda a la legibilidad a separar el código real para la clase interna del lugar donde lo está utilizando. Me gusta especialmente si ya estoy en un método largo o sangrado más de un nivel o dos.

a comentar sobre su punto sobre el rendimiento, las clases internas anónimas se compilan en clases normales, por lo que no debe existir ninguna diferencia de rendimiento.

0

El propósito de las clases anónimas es hacer que su clase requerida como local. Las clases anónimas se usan cuando estamos muy seguros de que una clase A en particular es el único consumidor de una Clase B y en ninguna otra parte se puede usar esta clase B. Entonces mejor definimos esa clase B como clase anónima dentro de la clase nombrada A. están escribiendo la lógica requerida dentro de la misma clase para evitar la creación de objetos desde el lado externo. Será fácil de mantener en términos de mantenimiento del código.Así que las clases anónimas te permiten hacer que tu código sea más conciso. Le permiten declarar y crear instancias de una clase al mismo tiempo. Son como las clases locales, excepto que no tienen un nombre. Úselos si necesita usar una clase local solo una vez.

Cuestiones relacionadas