Java 8 – zmiany w interfejsach
Java 8 – zmiany w interfejsach
Zmiany w interfejsach dotyczą możliwości dodawania definicji metod do interfejsów. Do wersji Java 8 możliwe było dodawanie tylko samych deklaracji czysto abstrakcyjnych metod. Wprowadzono nowe słowo kluczowe default:
public interface InterfacesDemo { default void printMsg(Object msg) { System.out.println("[log]" + " " + msg); } }
Ponadto możliwe jest dodawanie do interfesjów definicji metod statycznych – takich metod nie wolno nadpisywać:
public interface InterfacesDemo { default void printMsg(Object msg) { System.out.println("[log]" + " " + msg); } static void getInfo() { System.out.println("changes in interfaces in java8"); } }
Dlaczego taka zmiana? Otóż jeśli duża ilość klas implementuje dany interfejs to kiedy dochodzi nowa metoda to przed wersją 8 Javy trzeba było ją zaimplementować w każdej klasie. W przypadku kiedy metoda miałaby taką samą implementację we wszystkich klasach które implementują wspomniany interfejs dochodzi do redundancji kodu z ang. Boilerplate code. Deklarowanie metod których nie trzeba implementować w klasach pochodnych rozwiązuje ten problem. Wadą tego rozwiązania jest moim zdaniem to, że zaciera się granica pomiędzy klasą abstrakcyjną a pojęciem interfejsu. Całość przedstawia się następująco:
interface InterfacesDemo { default void printMsg(Object msg) { System.out.println("[log]" + " " + msg); } static void getInfo() { System.out.println("changes in interfaces in java8"); } } public class InterfacesMainDemo { public static void main(String[] args) { InterfacesDemo interfacesDemo = new InterfacesDemo() { }; interfacesDemo.printMsg("somethind msg"); InterfacesDemo.getInfo(); } }
Wynik:
[log] something msg changes in interfaces in java 8
Leave a comment