Java 8 - Métodos padrão
Java 8 introduz um novo conceito de implementação de método padrão em interfaces. Esse recurso é adicionado para compatibilidade com versões anteriores para que as interfaces antigas possam ser usadas para aproveitar o recurso de expressão lambda do Java 8.
Por exemplo, as interfaces 'List' ou 'Collection' não possuem a declaração do método 'forEach'. Assim, adicionar tal método simplesmente quebrará as implementações da estrutura de coleta. Java 8 introduz o método padrão para que a interface List/Collection possa ter uma implementação padrão do método forEach, e a classe que implementa essas interfaces não precisa implementar o mesmo.
Sintaxe
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
Vários padrões
Com funções padrão em interfaces, existe a possibilidade de uma classe estar implementando duas interfaces com os mesmos métodos padrão. O código a seguir explica como essa ambiguidade pode ser resolvida.
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
}
public interface fourWheeler {
default void print() {
System.out.println("I am a four wheeler!");
}
}
A primeira solução é criar um método próprio que substitua a implementação padrão.
public class car implements vehicle, fourWheeler {
public void print() {
System.out.println("I am a four wheeler car vehicle!");
}
}
A segunda solução é chamar o método padrão da interface especificada usando super.
public class car implements vehicle, fourWheeler {
public void print() {
vehicle.super.print();
}
}
Métodos padrão estáticos
Uma interface também pode ter métodos auxiliares estáticos do Java 8 em diante.
public interface vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}
Exemplo de método padrão
Crie o seguinte programa Java usando qualquer editor de sua escolha em, digamos, C:\> JAVA.
Java8Tester.java
Demonstração ao vivo
public class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
default void print() {
System.out.println("I am a vehicle!");
}
static void blowHorn() {
System.out.println("Blowing horn!!!");
}
}
interface FourWheeler {
default void print() {
System.out.println("I am a four wheeler!");
}
}
class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("I am a car!");
}
}
Verifique o resultado
Compile a classe usando javac compilador da seguinte forma -
C:\JAVA>javac Java8Tester.java
Agora execute o Java8Tester da seguinte forma -
C:\JAVA>java Java8Tester
Deve produzir a seguinte saída -
I am a vehicle! I am a four wheeler! Blowing horn!!! I am a car!
Java