Um dos recursos mais úteis do Java 8 são os novos default
métodos nas interfaces. Existem essencialmente duas razões (podem existir outras) pelas quais elas foram introduzidas:
- Fornecendo implementações padrão reais. Exemplo:
Iterator.remove()
- Permitindo a evolução da API do JDK. Exemplo:
Iterable.forEach()
Do ponto de vista de um designer de API, eu gostaria de poder usar outros modificadores nos métodos de interface, por exemplo final
. Isso seria útil ao adicionar métodos de conveniência, evitando substituições "acidentais" na implementação de classes:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
O acima já é prática comum se Sender
fosse uma classe:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Agora, default
e final
obviamente estão contradizendo palavras-chave, mas a palavra-chave padrão em si não teria sido estritamente necessária , portanto, suponho que essa contradição seja deliberada, para refletir as diferenças sutis entre "métodos de classe com corpo" (apenas métodos) e "interface métodos com corpo " (métodos padrão), ou seja, diferenças que ainda não compreendi.
Em algum ponto do tempo, o suporte para modificadores como static
e final
sobre métodos de interface ainda não foi totalmente explorado, citando Brian Goetz :
A outra parte é até que ponto vamos dar suporte a ferramentas de criação de classe em interfaces, como métodos finais, métodos privados, métodos protegidos, métodos estáticos etc. A resposta é: ainda não sabemos
Desde então, no final de 2011, obviamente, static
foi adicionado suporte a métodos em interfaces. Claramente, isso agregou muito valor às próprias bibliotecas JDK, como com Comparator.comparing()
.
Questão:
Qual é o motivo final
(e também static final
) nunca chegou às interfaces Java 8?
final
impede que um método seja substituído e, vendo como DEVE substituir métodos herdados de interfaces, não vejo por que faria sentido torná-lo final. A menos que isso signifique que o método é final APÓS substituí-lo uma vez .. Nesse caso, talvez haja q? Se não estou entendendo direito, por favor, deixe-me entender. Parece interessante
final
seria útil impedir que as classes de implementação substituíssem a implementação padrão de um método de interface.