Al igual que con muchas cosas, el enfoque correcto depende de lo que está tratando de hacer para el botón específico y qué más está haciendo con la actividad.
La clase de actividad implementa la interfaz :
esta es una buena opción cuando solo tiene un tipo de tarea para ejecutar cuando se llama a este oyente. Un ejemplo de esto sería una forma simple con varios campos y un botón de guardar. Prefiero que mi escucha de eventos no verifique la fuente del evento para decidir qué es lo que realmente hay que hacer. Sé que algunos pueden decir que esto es una cuestión de estilo, pero creo que al no requerir que el oyente haga esta verificación, hace que el código sea más fácil de seguir, ya que sabrá exactamente cómo se llama para cada evento.
Una clase diferente implementa la interfaz :
como dije anteriormente, prefiero esta opción para cuando tengo varios elementos que pueden activar el mismo evento. Extendiendo el ejemplo anterior, agreguemos un botón claro que también requiere un escucha de clics. Cree un oyente que preforma las acciones de guardar y uno que preforma las acciones claras. Cada escucha solo se agrega a los componentes que producirán esa acción.
Esta implementación tiene un beneficio adicional que puede utilizar si le importa. El beneficio es que evita que otras clases activen el evento dentro de su clase de actividad. Dado que el método de la interfaz debe ser público, cualquier persona con una referencia a la clase puede activar el evento. Si desea un control detallado sobre quién puede hacer qué en la aplicación, una clase separada evita que cualquier persona con una referencia a la actividad active o borre su formulario (o posiblemente rompa el código si el oyente utiliza la fuente, pero lo hace) no manejar mal entrada).
Una clase interna anónima implementa la interfaz :
Esta es realmente una forma específica de construir la segunda opción de usar una clase diferente como implementación. Esta opción puede restringir aún más quién tiene acceso para desencadenar el evento ya que nadie más puede crear una instancia de la clase. Sin embargo, creo que el factor más importante entre las dos opciones es cuánto trabajo se está haciendo. Borrar algunos campos de texto es una operación simple y directa. Sin embargo, el proceso de guardar el for puede implicar una serie de tareas si está validando la entrada (que debería estar haciendo), escribiendo en una base de datos para almacenar los valores y desencadenando alguna acción de guardado posterior. En este caso, crear una clase separada con su propio archivo proporcionará una división más clara entre el formulario de entrada y el procesamiento de datos. Esto a su vez mantiene el código del formulario en lugar de un archivo más grande con múltiples clases internas anidadas dentro.