Buenas,
Estoy un poco cansado ahora, pero te comento. Cuando se creo Java existía una importante carencia, que es la posibilidad de crear punteros a función que puedan ser pasados como parámetros. Para solucionar este problema concreto se implementaron las clases anónimas como solución para "salir del paso".
Como sabes, la función anónima consiste en incrustar el código de una clase y su implementación dentro de la llamada a un método, lo cual ya estéticamente rompe el flujo del código. Por otro lado impone excepciones a las reglas básicas de Java al permitir por ejemplo hacer un new de una interface, la cual en realidad se implementa "on the fly". Esto crea muchas dudas a los principiantes. Además, para acceder a cualquier variable de la clase que contiene a la clase anónima, estamos obligados a declarar dichas variables como final (el compilado obliga a hacerlo así para evitar accesos incorrectos, ya que estas variables podrían ser modificadas accidentalmente).
Todos esto es fácilmente solucionable con una implementación de closures como la de C#, que es mucho más lógica y elegante, y que por eso Java ha plagiado (en venganza quizás por el plagio que supuso C# en su momento
) en su versión 8
Un ejemplo vale más de mil palabras:
Función anónima:
Closures:
Código Java:
Ver originalbutton.
addActionListener(e
-> {System.
out.
println("Action Detected");});
Un saludo