16 mayo, 2015

Métodos por defecto en Interfaces de Java 8

En Java 8 se ha introducido un nuevo cambio al uso de interfaces, desde esta versión es posible implementar métodos por defecto en una interface.


public interface Herramienta {
 default public void ajustar(){
  System.out.println("Ajustando herramienta desde interface");
 } 
}


public class HerramientaImpl implements Herramienta {
 public void limpiar(){
  System.out.println("Limpiando herramienta");
 }
}


public class TestHerramienta {
 public static void main(String[] args) {
  HerramientaImpl herramientaImpl= new HerramientaImpl();
  herramientaImpl.ajustar();
 }
}
Un problema de ambiguedad se podría producir cuando una clase implementa dos o mas interfaces que tienen metodos por defecto con el mismo nombre:
public interface HerramientaElectrica{
 default public void ajustar(){
  System.out.println("Ajustando herramienta desde HerramientaElectrica ");
 }
}

public interface HerramientaManual {
 default public void ajustar(){
  System.out.println("Ajustando herramienta desde HerramientaManual ");
 }
}

public class HerramientaImpl implements HerramientaElectrica,HerramientaManual {
 
}

La solución al problema se encuentra en definir una implementación al método por defecto:


public class HerramientaImpl implements HerramientaElectrica,HerramientaManual {
 @Override
 public void ajustar() {
 }
}
Para invocar una implementación del método por defecto lo hacemos sobreescribiendo en nuestra clase
public class HerramientaImpl implements HerramientaElectrica,HerramientaManual {
 @Override
 public void ajustar() {
  HerramientaElectrica.super.ajustar();
 }
}