java - sirve - La clase abstracta como interfaz funcional.
ejercicios resueltos de clases abstractas en java (1)
En Java 8, una clase abstracta con un solo método abstracto no es una interfaz funcional ( JSR 335 ).
Esta interface
es una interfaz funcional:
public interface MyFunctionalInterface {
public abstract void myAbstractMethod();
public default void method() {
myAbstractMethod();
}
}
pero esta abstract class
no es:
public abstract class MyFunctionalAbstractClass {
public abstract void myAbstractMethod();
public void method() {
myAbstractMethod();
}
}
Por lo tanto, no puedo usar la clase abstracta como objetivo para expresiones lambda y referencias de métodos.
public class Lambdas {
public static void main(String[] args) {
MyFunctionalAbstractClass functionalAbstractClass = () -> {};
}
}
El error de compilación es: The target type of this expression must be a functional interface
.
¿Por qué los diseñadores del lenguaje impusieron esta restricción?
Este ha sido un tema importante desde el inicio del proyecto Lambda y ha recibido mucha reflexión. Brian Goetz, el arquitecto jefe del lenguaje Java, apoya firmemente la visión de lambda como una función , no como un objeto . Citar:
Creo que la mejor dirección para la evolución de Java es fomentar un estilo de programación más funcional. La función de Lambda es principalmente apoyar el desarrollo y el consumo de bibliotecas más funcionales.
Soy optimista sobre el futuro de Java, pero para avanzar, a veces tenemos que dejar de lado algunas ideas cómodas. Lambdas-son-funciones abre puertas. Lambdas-son-objetos los cierra. Preferimos ver las puertas abiertas.
Here hay un enlace a la fuente de la cita y aquí está la publicación más reciente de Brian que reitera los mismos puntos filosóficos y los reafirma con argumentos adicionales, más prácticos:
Hacer el modelo más simple abre las puertas a todo tipo de optimizaciones de máquinas virtuales. (La clave para deshacerse de la identidad es clave aquí). Las funciones son valores. Modelarlos como objetos los hace más pesados y complejos de lo que necesitan ser.
Antes de lanzar este caso de uso debajo del bus, hicimos un análisis de corpus para determinar la frecuencia con la que se usan los SAM de clase abstracta en comparación con los SAM de interfaz. Encontramos que en ese corpus, solo el 3% de las instancias de la clase interna candidata lambda tenían clases abstractas como objetivo. Y la mayoría de ellos eran susceptibles de refactorizaciones simples donde agregabas un constructor / fábrica que aceptaba un lambda que estaba orientado a la interfaz.