titledborder poner ejemplo borde java java-8 default-method

poner - Propósito de los métodos predeterminados o Defender en Java 8



setbounds java (4)

  1. los métodos por defecto hacen 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 la interfaz no lo hará obligatorio para todas las clases que implementan una interfaz. Simplificó la práctica de codificación

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

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

Para agregar nuevos métodos en la interfaz de Collection , no podrían haber agregado un nuevo método sin romper las versiones anteriores. Así que dijo que para el catering esto se agregó una nueva característica de los métodos predeterminados.

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 es necesario para agregar nuevos métodos a la interfaz sin romper el código del cliente. ¿O hay otros usos también?


Además de tener la posibilidad de agregar métodos a la interfaz en futuras versiones, existe el importante punto de permitir que una interface mantenga como una interfaz funcional incluso si tiene más de un método.

Una interfaz funcional tiene solo 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 ) al tiempo que proporciona métodos predeterminados para negar un Predicate o combinarlo con otro Predicate . Sin métodos predeterminados, estos métodos tenían que proporcionarse en otra clase de utilidad, como la clase de Collections anteriores a Java 8 (ya que no se quiere renunciar a la posibilidad de implementaciones lambda para dicha interface ).


Como dijiste, la motivación principal fue permitir la evolución de las interfaces existentes.

Sin embargo, hay razones por las que también querrás usarlas en nuevas interfaces:

Una de estas razones son los métodos que pueden implementarse 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 (véase AbstractList por ejemplo).

Si bien esto no crea un campo completamente nuevo, significa que puede tener interfaces amigables para el usuario final (con muchos métodos útiles), mientras que sigue siendo simple de implementar.


Hubo un problema con las interfaces que no estaban abiertas a la extensión, lo que significa que si hubiera una 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 fueron fáciles de desarrollar.

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

Con el lanzamiento de Java 8, ahora también es posible agregar un método predeterminado en las interfaces, lo que facilita su evolución. Con la adición del método predeterminado a una interfaz, la adición de un nuevo método, incluso para una interfaz no romperá el código preexistente.