Um dos recursos mais úteis do Java 8 são os novos defaultmé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 Senderfosse 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, defaulte finalobviamente 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 statice finalsobre 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, staticfoi 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?
finalimpede 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
finalseria útil impedir que as classes de implementação substituíssem a implementação padrão de um método de interface.