Rozhraní a defaultní metody v Javě

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.

Napsat komentář