Pregunta

En mi proyecto Android, que definen un par de devoluciones de llamada para operar en los clics de botón, eventos de conectividad, o eventos de interfaz de usuario, tales como Dilaog.onShow (). Para propósitos de demostración, he elegido una interfaz Ejecutable que debe ser lanzado desde un cierto código de actividad. Con Java, tengo diferentes formas de expresarme.

Un patrón sería el uso de clase anónima

runOnUiThread(new Runnable() { 
    public void run() { 
        doSomething(); 
    }
});

private void doSomething() {
}

otro - para definir una clase privada interna, es decir,

private DoSomething implements Runnable {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(new DoSomething());

otro - para usar un miembro privado, así:

private final Runnable doSomething = new Runnable() {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(doSomething);

Aquí hay otro, lo que más me gusta, porque por un lado que en realidad no construir objetos a menos que alguien realmente lo usa, ya que evita las clases adicionales, ya que puede tomar parámetros si es necesario.

private Runnable doSomething() { 
    return new Runnable() {
        public void run() { 
            // do something; 
        }
    }
}
...
runOnUiThread(doSomething());

Yo no busco a los argumentos de los gustos o las creencias religiosas, sino de capacidad de mantenimiento de código y rendimiento. Me gustaría recibir sugerencias y consejos que podrían ayudar a desarrollar mi propia preferencia, posiblemente, -. Diferentes preferencias según la circunstancia dada

Spoiler:

El progreso de Java se ha convertido esta cuestión obsoleta, véase la respuesta aceptada.

¿Fue útil?

Solución 5

Hoy en día, cuando Java 8 es casi disponible para Android y Android estudio automagicamente pretende que lambdas ya son compatibles, la clase anónima (# 1) solución parece ser la opción obvia:

derrumbó

expandido

Otros consejos

No creo que hay alguna forma idiomática a devoluciones de llamada mango.

Por lo general inline una clase anónima en primer lugar. Cuando el método se hace demasiado grande, extraigo la creación clase en una función separada. Cuando la clase se hace demasiado grande, puedo extraer de su propio archivo.

Si está utilizando un IDE como Eclipse puede realizar todas estas refactorizaciones de forma automática y segura.

Al igual que @Manuel Silva y Campeón @Toby, me gusta las clases internas anónimas. Son un poco difícil de leer, no son muy "OO" en el que no pueden ser extendidos, no puede tener DIP, emisores o lo que sea a tweak comportamiento, etc ..., y que a menudo terminan violando el principio DRY cuando se agrega el mismo código en 27 lugares diferentes.

Yo tiendo a usar los miembros privados (su opción # 3), o una función privada (su cuarto estilo) normalmente denominado getAsRunnable ().

Estoy muy nuevo en Android, pero las clases anónimas me hace náuseas y parece que haya una alternativa a runOnUiThread todos modos: AsyncTask, discute aquí: runOnUIThread pregunta

Desde mi punto de vista, clase anónima realmente disminuir la legibilidad. Dado que el código Ui es a menudo muy prolijo, añadiendo devoluciones de llamada anónima para cada botón puede conducir a muy grandes clases. Como consecuencia de ello estoy usando clases privadas internas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top