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.