W Javie 8 interfejsy mogą zawierać zaimplementowane metody, metody statyczne i tak zwane metody „domyślne” (których klasy implementujące nie muszą zastępować).
W mojej (prawdopodobnie naiwnej) opinii nie było potrzeby naruszania takich interfejsów. Interfejsy zawsze były umową, którą musisz wypełnić, a jest to bardzo prosta i czysta koncepcja. Teraz jest to połączenie kilku rzeczy. W mojej opinii:
- metody statyczne nie należą do interfejsów. Należą do klas użytkowych.
- „domyślne” metody nie powinny być w ogóle dozwolone w interfejsach. W tym celu zawsze można użyć klasy abstrakcyjnej.
W skrócie:
Przed Javą 8:
- Możesz użyć klas abstrakcyjnych i regularnych, aby zapewnić metody statyczne i domyślne. Rola interfejsów jest jasna.
- Wszystkie metody interfejsu powinny zostać zastąpione przez implementację klas.
- Nie można dodać nowej metody do interfejsu bez modyfikacji wszystkich implementacji, ale tak naprawdę jest to dobra rzecz.
Po Javie 8:
- Praktycznie nie ma różnicy między interfejsem a klasą abstrakcyjną (inną niż wielokrotne dziedziczenie). W rzeczywistości możesz emulować zwykłą klasę za pomocą interfejsu.
- Podczas programowania implementacji programiści mogą zapomnieć o przesłonięciu metod domyślnych.
- Wystąpił błąd kompilacji, jeśli klasa próbuje zaimplementować dwa lub więcej interfejsów mających domyślną metodę o tej samej sygnaturze.
- Dodając domyślną metodę do interfejsu, każda klasa implementująca automatycznie dziedziczy to zachowanie. Niektóre z tych klas mogły nie zostać zaprojektowane z myślą o tej nowej funkcjonalności, co może powodować problemy. Na przykład, jeśli ktoś doda nową domyślną metodę
default void foo()
do interfejsuIx
, wówczas klasaCx
implementującaIx
i posiadająca prywatnąfoo
metodę z tym samym podpisem nie zostanie skompilowana.
Jakie są główne przyczyny tak poważnych zmian i jakie nowe korzyści (jeśli w ogóle) dodają?
@Deprecated
kategorii! metody statyczne są jedną z najbardziej nadużywanych konstrukcji w Javie z powodu ignorancji i lenistwa. Wiele metod statycznych zwykle oznacza niekompetentny programator, zwiększenie sprzężenia o kilka rzędów wielkości i jest koszmarem dla testów jednostkowych i refaktoryzacji, gdy zdasz sobie sprawę, dlaczego są złym pomysłem!