Java 8 nos trae muchas novedades. Hoy vamos a hablar de los métodos default de Java, de su uso, sus características y su verdadera potencia.

¿Qué es un método default?

Lo primero que tenemos que saber es que los métodos default de Java sólo se permiten introducir en interfaces, por lo tanto no existen en clases. Estos métodos, al igual que todos los demás en las interfaces, son de manera implícita públicos. Su principal diferencia es que no son abstractos como el resto y necesitan proporcionar una implementación para pasar la fase de compilación.

Hasta ahora, cuando implementábamos una interfaz en una clase, ésta nos obligaba a implementar también todos sus métodos. Sin embargo no pasa lo mismo con los métodos default que ya estarán disponibles en esas clases sin haberlos implementado. Más adelante veremos esto con más detalle.

Por lo tanto la idea principal de estos métodos es añadir nuevas funcionalidades a nuestras interfaces manteniendo la compatibilidad con el código ya existente.

Estructura de un método default de Java

Los siguientes puntos son obligatorios para crear un método default en el lenguaje Java:

  • Comenzará por la palabra reservada default.
  • Proporcionará una implementación al método.
  • Debe de encontrarse dentro de una interfaz.
public interface InterfazNormal {
    void metodoAbstracto(); 
    default void metodoDefault() {     
        System.out.println("Hola"); 
    }
}

Qué nos permite un método default en Java

Lo que nos permite es de manera flexible modificar el patrón de abstracción que hasta ahora las interfaces proporcionaban. Podremos modificar el contrato de la interfaz y automáticamente propagarlo a todas las clases que la implementan sin tener que editarlas todas (que se hubieran roto al no contemplar el nuevo método añadido). Ahora el ejemplo.

Si en la actualidad tuviéramos una interfaz implementada por 20 clases en nuestra aplicación y necesitamos añadir un nuevo método a esa interfaz para que nuestro diseño siga siendo rígido, tendríamos que modificar la interfaz y posteriormente modificar todas las clases que la implementan.

public interface Vendible {
    void vender();
}
public class Lavadora implements Vendible {

	private int precio = 100;
	
	@Override
	public void vender() {
		System.out.print(String.format("He ganado %d euros", precio));
	}

}

Cómo vemos, Lavadora es una de nuestras 20 clases y tiene el método vender que la interfaz Vendible le está obligando a implementar. Todo correcto hasta ahora. Pero llega el día en el que nos obligan a asegurar todos los productos que vendemos en nuestra aplicación. Por lo tanto todos nuestros productos vendibles son asegurables. Haremos un pequeño cambio a nuestra interfaz:

public interface Vendible {
    void vender(); 
    default void asegurar() {     
        System.out.print("Producto Asegurado."); 
    }
}

Ahora, todos nuestros objetos vendibles implícitamente habrán heredado el método asegurar con la misma implementación. Que bien! Ya estamos cubiertos sin apenas modificar nada y todo gracias a los métodos default de Java.

Podemos ir más lejos todavía, resulta que vendemos animales, al ser productos vivos tendremos que proporcionar una implementación distinta a la hora de asegurarlo, vaya faena. En este caso, modificaremos nuestra case «Animal» de la siguiente manera:

public class Animal implements Vendible {
    private int precio = 100; 
    @Override public void vender() {     
        System.out.print(String.format("He ganado %d euros", precio)); 
    } 
    @Override public void asegurar() {     
        Vendible.super.asegurar();     
        System.out.print("Producto asegurado como animal"); 
    }
}

En este caso nos hemos visto obligados a modificar una clase que implementa nuestra interfaz, pero mantenemos los cambios en todas las demás sin variaciones. Todas las clases que ahora heredan de Animal tendrán la implementación de asegurar() correcta.

He añadido la primera línea de la nueva implementación para que conozcamos como implícitamente podríamos llamar a la implementación original de nuestro método en la interfaz.

¿Qué pasará en estos casos?

Creo que es interesante saber en estos casos no comunes que es lo que hace Java.

1.Si no implementamos un método default en nuestra clase

La clase Java automáticamente heredará ese método, no tienes que preocuparte por nada. (Realmente no es un caso raro este)

2. Mi interfaz extiende de una interfaz con método default

En este caso, tienes 3 posibles opciones que puedes seguir con estos metodos default de java:

  • La interfaz hija heredará el método default automáticamente.
  • Redeclaras el método en la interfaz hija y lo conviertes en abstracto (deja de ser un método default).
  • Redefines el método con una implementación distinta.

Si te surgen algunas dudas más sobre este tipo de métodos, puedes escribirme un comentario y las iré añadiendo al listado.

Fuente Oficial – Default Methods

Métodos default de Java 8
Etiquetado en:            

2 pensamientos en “Métodos default de Java 8

  • 3 julio, 2020 a las 2:36 am
    Enlace permanente

    Que pasa si yo quito la anotacion @Override de la clase que implementa la interfaz, aun asi estaria dandole una definicion.
    Ejemplo:
    public interface IOperaciones {
    int multiplicar(int x, int y);

    default void metodoDefault() {
    System.out.println(«Soy un metodo default»);
    }
    }

    //Clase que implementa
    public class Operaciones implements IOperaciones{

    @Override
    public int multiplicar(int x, int y) {
    return x*y;
    }

    //No lleva notacion @Override
    public void metodoDefault() {
    System.out.println(«Soy un metodo diferente, ya definido»);
    }

    public static void main(String agrs[]) {
    Operaciones op = new Operaciones();
    System.out.println(op.multiplicar(5, 6));
    op.metodoDefault();
    }
    }

    La salida de esto es :

    30
    Soy un metodo diferente, ya definido

    Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Social media & sharing icons powered by UltimatelySocial