Propósito de los métodos por defecto o Defender en Java 8


Java 8 ha incluido una nueva característica llamada Métodos Defensores que permite la creación de la implementación de métodos predeterminados en la interfaz.

Ahora, en primer lugar, este es un gran cambio de paradigma para todos los programadores condensados en Java. Vi una presentación JavaOne 13 dada por Brain Goetz donde estaba discutiendo sobre las nuevas stream() y parallelStream() implementaciones en la biblioteca de Colecciones.

Para agregar nuevos métodos en la interfaz Collection, no podrían haber agregado un nuevo método sin romper las versiones anteriores. Así que dijo que para la restauración de esta una nueva característica de los métodos predeterminados se añadió.

public interface SimpleInterface {
  public void doSomeWork();

  //A default method in the interface created using "default" keyword
  default public void doSomeOtherWork(){
    System.out.println("DoSomeOtherWork implementation in the interface");
  }
}

Ahora mi pregunta es básicamente que los métodos predeterminados solo son útiles cuando se necesitan para agregar nuevos métodos a la interfaz sin romper el código del cliente. ¿O también tiene otros usos?

Author: Narendra Pathai, 2013-11-15

4 answers

Además de tener la posibilidad de añadir métodos a la interfaz en futuras versiones, no es el punto importante de permitir que un interface quedarse interfaz funcional, incluso si tiene más de un método.

Una interfaz funcional solo tiene un método abstracto no predeterminado que se puede implementar a través de una expresión lambda. Un ejemplo es la interfaz Predicate que solo tiene un método abstracto (test) mientras proporciona métodos predeterminados para negar un Predicate o combinándolo con otro Predicate. Sin métodos predeterminados, estos métodos tenían que proporcionarse en otra clase de utilidad como la clase pre-Java 8 Collections (ya que no desea renunciar a la posibilidad de implementaciones lambda para tal interface).

 49
Author: Holger,
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
2015-01-05 14:51:47

Como usted ha dicho, la motivación principal fue permitir la evolución de las interfaces existentes.

Sin embargo hay razones por las que querrías usarlos en interfaces nuevas también:

Una de esas razones son los métodos que se pueden implementar fácilmente utilizando los otros métodos (no predeterminados) de la interfaz. El uso de métodos default para esto reduce la necesidad de combinaciones Foo-interface/AbstractFoo-base-implementation (ver AbstractList por ejemplo).

Mientras que esto no crea un campo completamente nuevo, significa que puede tener interfaces fáciles de usar (con muchos métodos útiles), al mismo tiempo que lo mantiene simple de implementar.

 19
Author: Joachim Sauer,
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-11-15 10:17:04

Hubo un problema con las interfaces que no estaban abiertas a la extensión, lo que significa que si hubiera necesidad de agregar un nuevo método a una interfaz, se habría roto la implementación existente de estas interfaces. Por lo tanto, era imperativo que todas las clases que implementaban esa interfaz tuvieran que proporcionar implementación para el método recién agregado, incluso si el método no era necesario. Por lo tanto, las interfaces no eran fáciles de desarrollar.

Un ejemplo que viene a la mente es Java MapReduce API para Hadoop, que se cambió en la versión 0.20.0 para favorecer las clases abstractas sobre las interfaces, ya que son más fáciles de evolucionar. Lo que significa que se puede agregar un nuevo método a la clase abstracta (con implementación predeterminada), sin romper las implementaciones antiguas de la clase.

Con el lanzamiento de Java 8, ahora es posible agregar el método predeterminado en las interfaces también, lo que las hace más fáciles de evolucionar también. Con la adición del método predeterminado a una interfaz, la adición de un nuevo método, incluso a una interfaz no rompe el código preexistente.

 1
Author: infoj,
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
2015-05-05 17:11:35
  1. los métodos predeterminados hicieron posible el concepto de programación funcional. Para el código de tipo de programación funcional solo necesitamos un método abstracto .
  2. Además, agregar un método en interfaz no lo hará obligatorio para todas las clases que implementen una interfaz. Simplificó la práctica de codificación
 0
Author: Deepak,
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-07-21 12:07:45