¿Java Interface Metodos privados? . Esta es una pregunta que nos puede parecer absurda ya que un interface esta diseñado por métodos eminentemente públicos. Si a un método de un interface en Java no se le asigna un ámbito de visibilidad es publico por defecto . La pregunta que uno se puede hacer es ¿Puede un interface de Java soportar métodos privados? La respuesta parece trivial y debiera ser que No. Lamentablemente las cosas no son tan sencillas como parece y un interface a partir de Java 8 puede disponer de métodos con código y dentro de ellos podrían existir métodos privados .
Java Interface Metodos privados
Esos métodos con código pueden ser de dos tipos . Default Methods que hacen referencia a métodos que afectan a las instancias de la clase o Static Methods que son métodos estáticos como su nombre indica y pertenecen a la clase en sí. Estos métodos podrían ser privados a nivel de una interface. Vamos a poner un ejemplo , imaginémonos que disponemos de un interface que se denomina Facturable. Ese interface tiene un método importe() que nos indica el importe Facturable de un Objeto.
public interface Facturable { double importeTotal(); }
Puedo por lo tanto crear una clase que implemente este interface :
public class Caja implements Facturable { private double importe; public Caja(double importe) { super(); this.importe = importe; } @Override public double importeTotal() { // TODO Auto-generated method stub return importe; } }
Con lo cual nos encontramos en una situación clásica una Caja puede ser Facturable y la implementación del interface se puede usar:
public class PrincipalFacturable { public static void main(String[] args) { Caja c=new Caja(100); Caja c2= new Caja(200); System.out.println(c.importeTotal()); } }
El resultado será :
100.0
Ahora bien cuando uno tiene elementos facturables puede hacer unos que sean mas urgentes de cobrar que otros. Podríamos diseñar el interface con un método estático privado y un método default ( de instancia).
public interface Facturable { double importeTotal(); private static Facturable esMasUrgente(Facturable a , Facturable b) { return a.importeTotal()>b.importeTotal()?a:b; } default Facturable esMasUrgente(Facturable b) { return esMasUrgente(this,b); } }
De esta manera tenemos un Java Interface Private Methods . El método privado define que elemento Facturable es más urgente de cobrar y luego usa un default método publico para hacerle visible para la clase. Es momento de usarle.
public class PrincipalFacturable { public static void main(String[] args) { Caja c=new Caja(100); Caja c2= new Caja(200); System.out.println(c.esMasUrgente(c2).importeTotal()); } }
Esto nos imprimirá 200 que es el importe más urgente de cobrar utilizando el Default Method esMasUrgente que delega en el Java Interface Private Method.