Java 8: métodos de extensión virtual vs clase abstracta


Estoy viendo los nuevos métodos de extensión virtual en interfaces Java 8:

public interface MyInterface {
   default String myMethod() { 
      return "myImplementation"; 
   }
}

Entiendo su propósito al permitir que una interfaz evolucione con el tiempo, y el bit de herencia múltiple, pero se ven terriblemente como una clase abstracta para mí.

Si está haciendo un trabajo nuevo, ¿se prefieren las clases abstractas sobre los métodos de extensión para proporcionar implementación a una "interfaz" o estos dos enfoques son conceptualmente equivalentes?

Author: Ravindra babu, 2013-08-13

5 answers

Un propósito principal de tales construcciones es preservar la compatibilidad hacia atrás. La adición de cierres al lenguaje Java es una alteración bastante importante, y las cosas deben actualizarse para aprovechar al máximo esto. Por ejemplo, Collection en Java 8 tendrá métodos como forEach() que funcionan en conjunto con lambdas. Simplemente agregar tales métodos a la interfaz preexistente Collection no sería factible, ya que rompería la compatibilidad hacia atrás. Una clase que escribí en Java 7 la implementación de Collection ya no compilaría ya que carecería de estos métodos. En consecuencia, estos métodos se introducen con una implementación "predeterminada". Si conoces Scala, puedes ver que Java interface s se están volviendo más como Scala traits.

En cuanto a interfaces vs clases abstractas, las dos siguen siendo diferentes en Java 8; todavía no se puede tener un constructor en una interfaz, por ejemplo. Por lo tanto, los dos enfoques no son "conceptualmente equivalentes" per se. Las clases abstractas son más estructurado y puede tener un estado asociado con ellos, mientras que las interfaces no pueden. Usted debe utilizar lo que tenga más sentido en el contexto de su programa, al igual que lo haría en Java 7 y abajo.

 31
Author: arshajii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 00:18:58

Las clases abstractas mantienen el estado (campos de instancia), para proporcionar un comportamiento común (métodos).
Usted no lo hace típicamente (nunca?) ver una clase abstracta sin estado.

Interfaces especifique la funcionalidad. Están destinados a declarar el comportamiento como un contrato, no implementarlo.
Por lo tanto, cualquier método que se especifique como parte de una interfaz son métodos "auxiliares" 't no afectan a la implementación.

 5
Author: Mehrdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-13 00:39:21
  1. Las clases abstractas no pueden ser clases raíz de expresiones lambda, mientras que las interfaces con métodos de extensión virtual pueden serlo.
  2. Las clases abstractas pueden tener constructores y variables miembro, mientras que las interfaces no pueden. Creo que es la ejecución de un posible constructor, y el posible lanzamiento de una excepción comprobada que prohíbe que las clases abstractas sean la raíz de una expresión lambda.

Si desea escribir una API que permita el usuario para usar expresiones lambda, debe usar interfaces en su lugar.

 5
Author: aepurniet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-20 11:12:44

Clases abstractas puntúa sobre java-8 interfaces en las áreas inferiores.

  1. Con las clases abstractas, puede declarar campos que son no estático y final, y definir métodos concretos públicos, protegidos y privados. Con las interfaces, todos los campos son automáticamente públicos, estáticos y finales, y todos los métodos que declare o defina (como métodos predeterminados) son públicos

  2. Estado mutable puede ser compartido / modificado con clases secundarias a diferencia de la interfaz que solo tienen constantes

  3. La clase abstracta se puede usar para implementar Template_method_pattern : Define el esqueleto del programa de un algoritmo en una operación, aplazando algunos pasos a subclases.
  4. La clase abstracta se puede usar para implementar Decorador_pattern: Un patrón de diseño que permite que el comportamiento se agregue a un objeto individual, ya sea estática o dinámicamente, sin afectar al comportamiento de otros objetos de la misma clase.
 0
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-25 16:32:29

La diferencia entre la clase abstracta y la interfaz funcional son muchas como todas las diferencias entre una interfaz normal y la clase abstracta, pero la diferencia de medida es podemos tener métodos predeterminados en interfaz funcional pero no en clase abstracta, esto cambia y ayudó a toda la implementación de la colección en java 8 foreach() y otros métodos de rendimiento con el uso de lambda

package com.akhi;
public abstract class AbstractDemo {
abstract void letsRun(); // abstract valid
public String toString(); // invalid but valid in interface or functional interface

public boolean equals(Object o); // invalid but valid in interface or functional interface

public int concrete() { // Concrete is invalid in interface
    return 1;
}

public default int getMult(int a, int b) // default invalid but valid in case of functional
{
    return a * b;
}

public static int getSum(int a, int b) // static allowed
{
    return a + b;
}
}

 0
Author: Akhilesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 09:41:15