2012-06-15 16 views
8

He leído que en las interfaces Java no se pueden crear instancias (in the documentation, Interfaces). Runnable, por definición, es una interfaz que debería ser implementada por alguna clase. Pero en el siguiente fragmento de código de una de mis aplicaciones de Android veo que se ha utilizado un constructor vacío: Runnable() ... (no estoy seguro de si es un constructor) y se ha creado una instancia: getStatus.Android y Java: uso del ejecutable

final Runnable getStatus = new Runnable() 
{ 
    public void run() 
    { 
     TextView uat = (TextView) findViewById(R.id.useAndThrow); 
     uat.setText(MyThread.getStatus()); 
     return; 
    } 
}; 

Lo que he llegado a saber:

  1. Esta es quizás un ejemplo de clase anónima.
  2. La instancia no es realmente de interfaz.

Pero no puedo conectar los puntos. Suponiendo que el código anterior estuviera dentro de la clase myActivity, ¿qué se está instanciando y cómo es esta clase anónima?

Un poco de detalle sería genial.

Respuesta

7

Se llama una "clase anónima". Algunas notas al respecto:

  1. No le proporcionó un nombre, por lo que se creó uno para usted. Para ver cuál es su nombre real, simplemente escríbalo en la consola o lea el bytecode.

  2. La clase anónima, si se crea en el ámbito de la clase externa, tiene una referencia a sus campos, al igual que cualquier clase interna. En general, tiene el mismo alcance de donde fue creado.

  3. Es una cosa muy común que hacer si todo lo que necesita es una implementación simple. Cuantos más códigos haya, más debería considerar colocarlos en otro archivo (para orden, no porque no puede).

  4. Runnable no es la única interfaz que es común. En Android, utiliza OnClickListener, OnTouchListener, ...

  5. Dado que la clase anónima tiene el mismo alcance que el lugar donde fue declarada, significa que tiene una referencia. Intente nunca mantener una clase anónima durante demasiado tiempo (por ejemplo, en una referencia estática), ya que esto podría provocar pérdidas de memoria. En Android es muy importante, ya que este sample muestra (habla de objetos arrastrables, pero una clase anónima también puede tener una referencia a un contexto).

  6. Algunas de las desventajas de las clases anónimas son que no tienen un constructor y que no pueden implementar más de una interfaz.Tiene un uso muy limitado, pero es muy popular, ya que es muy fácil de usar (y leer).

1

Lo que se está instanciando es una subclase anónima de Runnable. Se llama anónimo porque el tipo en sí no tiene un nombre. En esta subclase está implementando el método run() que se especifica en la interfaz Runnable.

El tipo de getStatus es Runnable, sin embargo, el objeto que se está referenciado por getStatus es en realidad una aplicación de Runnable que no tiene un tipo llamado explícito.

0

El código está creando una instancia de una clase que implementa la interfaz Runnable. La clase no tiene un nombre.

Cuestiones relacionadas