Métodos de interface privada, exemplo de caso de uso?
"O suporte a métodos privados em interfaces foi brevemente considerado para inclusão no Java SE 8 como parte do esforço para adicionar suporte às Expressões Lambda, mas foi retirado para permitir um melhor foco nas tarefas de maior prioridade para o Java SE 8. Agora é proposto que o suporte a métodos de interface privada seja realizado, permitindo assim que métodos não abstratos de uma interface compartilhem código entre eles ".
É o que diz a especificação parahttp://openjdk.java.net/jeps/213 e diz no relatório de errohttps://bugs.openjdk.java.net/browse/JDK-8071453 .
Mas não consigo pensar em nenhum caso de uso em que isso seja necessário, mesmo com a breve explicação dada acima. Posso pedir um exemplo em que "métodos de interface privada" sejam úteis em termos de código?
EDITAR: Portanto, a resposta é que, devido ao modo como as implementações padrão foram adicionadas às interfaces no Java 8, pode haver casos em que as implementações padrão estão usando a mesma base de código.
Por exemplo,
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;
}
}
Exemplo bobo, eu sei. Mas digamos que queremos usarinitializeMyClass(MyClass, Params)
nos dois métodos. No entanto, se fizermos assim (método padrão), entãoinitializeMyClass(MyClass, Params)
fará parte da interface pública! Para impedir que isso aconteça, só podemos manter o código deinitializeMyClass(MyClass, Params)
dentro decreateMyClass()
métodos padrão. O que resulta na duplicação de código, o que é indesejável.
Portanto, isso causa problemas com a refatoração e, para remover essa duplicação de código, métodos padrão privados são permitidos.
Obrigado por responder!