java - grafica - Métodos de interfaz privada, ejemplo de uso de caso?
java swing pdf (3)
"El soporte para métodos privados en interfaces fue considerado brevemente para su inclusión en Java SE 8 como parte del esfuerzo para agregar soporte para Lambda Expressions, pero se retiró para permitir un mejor enfoque en las tareas de mayor prioridad para Java SE 8. Ahora se propone que se admite el uso de métodos de interfaz privados, lo que permite que los métodos no abstractos de una interfaz compartan el código entre ellos ".
Así dice la especificación para http://openjdk.java.net/jeps/213 y dice en el informe de error https://bugs.openjdk.java.net/browse/JDK-8071453 .
Pero realmente no puedo pensar en ningún caso de uso donde sea necesario, incluso con la breve explicación dada anteriormente. ¿Puedo pedir un ejemplo en el que los "métodos de interfaz privados" sean útiles en términos de código?
EDIT: Entonces, la respuesta es que, debido a la forma en que se han agregado las implementaciones predeterminadas a las interfaces en Java 8, puede haber casos en los que las implementaciones predeterminadas estén usando la misma base de código.
Por ejemplo,
public interface MyInterface {
default void initializeMyClass(MyClass myClass, Params params) {
//do magical things in 100 lines of code to initialize myClass for example
}
default MyClass createMyClass(Params params) {
MyClass myClass = new MyClass();
initializeMyClass(myClass, params);
return myClass;
}
default MyClass createMyClass() {
MyClass myClass = new MyClass();
initializeMyClass(myClass, null);
return myClass;
}
}
Ejemplo tonto, lo sé. Pero digamos que queremos usar initializeMyClass(MyClass, Params)
en ambos métodos. Sin embargo, si lo hacemos así (método predeterminado), ¡ initializeMyClass(MyClass, Params)
será parte de la interfaz pública! Para evitar que eso suceda, solo podemos mantener el código completo de initializeMyClass(MyClass, Params)
dentro de los métodos predeterminados de createMyClass()
. Lo que resulta en la duplicación de código, que es indeseable.
Por lo tanto, esto causa un problema con la refactorización, y para eliminar dicha duplicación de código, se permiten los métodos privados predeterminados.
¡Gracias por responder!
¿Por qué no simplemente? (Simplemente = usando Java8):
PS: debido a la ayuda privada no es posible en Java
public interface MyInterface {
private static class Helper{
static initializeMyClass(MyClass myClass, Params params){
//do magical things in 100 lines of code to initialize myClass for example
}
}
default MyClass createMyClass(Params params) {
MyClass myClass = new MyClass();
Helper.initializeMyClass(myClass, params);
return myClass;
}
default MyClass createMyClass() {
MyClass myClass = new MyClass();
Helper.initializeMyClass(myClass, null);
return myClass;
}
}
Java 9 permite declarar un método privado dentro de la interfaz. Aquí está el ejemplo de esto.
interface myinterface {
default void m1(String msg){
msg+=" from m1";
printMessage(msg);
}
default void m2(String msg){
msg+=" from m2";
printMessage(msg);
}
private void printMessage(String msg){
System.out.println(msg);
}
}
public class privatemethods implements myinterface {
public void printInterface(){
m1("Hello world");
m2("new world");
}
public static void main(String[] args){
privatemethods s = new privatemethods();
s.printInterface();
}
}
Para eso, necesitas actualizar jdk hasta la versión 1.9.
Las interfaces ahora pueden tener métodos predeterminados . Se agregaron para que se pudieran agregar nuevos métodos a las interfaces sin romper todas las clases que implementan esas interfaces modificadas.
Si se necesitaran dos métodos predeterminados para compartir código, un método de interfaz privada les permitiría hacerlo, pero sin exponer ese método privado y todos sus "detalles de implementación" a través de la interfaz.