Defaultní metody v rozhraní nám umožňují přidávat do rozhraní nové metody bez toho, abychom rozbili původní kód. Zde je jednoduchý příklad.
rozhraní MyIntf.java
public interface MyIntf {
void print(String text);
}
implementace MyIntfImpl.java
public class MyIntfImpl implements MyIntf {
@Override
public void print(String text) {
System.out.println("Printing: " + text);
}
}
třída s main metodou App.java
public class App {
public static void main(String[] args) {
MyIntfImpl myInftImpl = new MyIntfImpl();
myInftImpl.print("Nějaký text");
}
}
Pokud nyní do rozhraní přidáme další metodu, dostaneme kompilační chybu.
public interface MyIntf {
void print(String text);
void show(String text);
}
Chyba
The type MyIntfImpl must implement the inherited abstract method MyIntf.show(String)
Toto lze vyřešit defaultní metodou.
public interface MyIntf {
void print(String text);
default void show(String text) {
System.out.println("Showing: " + text);
}
}
Tuto metodu pak lze klidně používat.
public class App {
public static void main(String[] args) {
MyIntfImpl myInftImpl = new MyIntfImpl();
myInftImpl.print("Nějaký text");
myInftImpl.show("Nějaký text");
}
}
Nebo ji lze v implementacích přepsat (override).
public class MyIntfImpl implements MyIntf {
@Override
public void print(String text) {
System.out.println("Printing: " + text);
}
@Override
public void show(String text) {
System.out.println("Showing two times: " + text + text);
}
}
Defaultní metody přestavují elegantní způsob jak zabezpečit zpětnou kompatibilitu a zároveň kód rozvíjet.