Como sabemos, Java 8 nos permitió crear métodos predefinidos y estáticos en Interface. La intención era agregar nuevos métodos a las interfaces sin romper las clases que ya implementaban esas interfaces. Java 9 introdujo otra característica nueva, Java 9 SE en adelante que podemos tener métodos privados en interfaces. En esta guía, aprenderemos por qué agregaron esta función, para qué sirve y cómo trabajar con ella.
¿Por qué Java 9 nos permite tener métodos privados en las interfaces?
Java 9 introdujo métodos privados en las interfaces para eliminar la redundancia compartir el código común de múltiples métodos predefinidos a través de métodos privados.
Para entender esto necesitamos hacer un ejemplo en Java 8 (sin métodos privados) y luego haremos el mismo ejemplo con Java 9 (usando métodos privados).
Ejemplo en Java 8: varios métodos predefinidos con código duplicado (código común)
En este ejemplo veremos cómo los métodos integrados pueden tener código duplicado que aumenta innecesariamente las líneas de código y hace que el código sea menos legible. Volveremos al mismo ejemplo usando métodos privados para ver cómo los métodos privados pueden ayudarnos a evitar el código duplicado.
interface MyInterfaceInJava8 { default void method1() { System.out.println("Starting method"); System.out.println("Doing someting"); System.out.println("This is method1"); } default void method2() { System.out.println("Starting method"); System.out.println("Doing someting"); System.out.println("This is method2"); } } public class JavaExample implements MyInterfaceInJava8{ public static void main(String args[]) { JavaExample je = new JavaExample(); je.method1(); je.method2(); } }
Producción:
Ejemplo de Java 9: métodos predefinidos que comparten código común utilizando métodos privados
Estamos tomando el mismo ejemplo que vimos anteriormente. Esta vez presentaremos un método privado para compartir código común.
interface MyInterfaceInJava9 { default void method1() { //calling private method printLines(); System.out.println("This is method1"); } default void method2() { //calling private method printLines(); System.out.println("This is method2"); } private void printLines() { System.out.println("Starting method"); System.out.println("Doing someting"); } } public class JavaExample implements MyInterfaceInJava9{ public static void main(String args[]) { JavaExample je = new JavaExample(); je.method1(); je.method2(); } }
Producción:
Starting method Doing someting This is method1 Starting method Doing someting This is method2
Como puede ver, la salida es la misma y el tamaño del código se ha reducido.
En base a esto podemos decir que el ventajas de tener métodos privados en las interfaces somos:
1. Permite que métodos predefinidos compartan código común para evitar código duplicado (redundancia)
2. Mejorar la legibilidad del código.
Java 9: métodos estáticos privados
Hasta ahora hemos aprendido a usar métodos privados en interfaces para compartir el código común de métodos predefinidos. Java 9 también nos permite tener métodos estáticos privados en interfaces.
Comenzando con Java 8 podemos tener métodos estáticos en interfaces junto con métodos predefinidos. No podemos compartir el código común de los métodos estáticos usando el método privado no estático, tenemos que usar el método estático privado para hacerlo.
Tomemos un ejemplo para entenderlo.
interface MyInterfaceInJava9 { static void method1() { //calling private method printLines(); System.out.println("This is method1"); } static void method2() { //calling private method printLines(); System.out.println("This is method2"); } //this must be static else we will get compilation error private static void printLines() { System.out.println("Starting method"); System.out.println("Doing someting"); } default void mymethods() { method1(); method2(); } } public class JavaExample implements MyInterfaceInJava9{ public static void main(String args[]) { JavaExample je = new JavaExample(); je.mymethods(); } }
Producción:
Starting method Doing someting This is method1 Starting method Doing someting This is method2
Aquí está la captura de pantalla de Eclipse Oxygen.