Statyczne metody w interfejsach pojawiły się od Java 8. Są deklarowane z użyciem słowa kluczowego static i implementowane bezpośrednio w interfejsie. Statyczne metody nie są dziedziczone przez klasy implementujące, a wywoływane są przez nazwę interfejsu.
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);Pytanie: Czy statyczna metoda interfejsu może być wywołana przez obiekt klasy implementującej?
Odpowiedź: Nie, statyczna metoda interfejsu zawsze jest wywoływana przez nazwę interfejsu, a nie przez instancję lub nazwę klasy implementującej. Przykład spowoduje błąd kompilacji:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // Błąd! Musi być MathUtils.sum(1, 2)
Historia
Programiści błędnie próbowali "nadpisać" statyczną metodę interfejsu w klasie implementującej i oczekiwali wywołania tej metody przez instancję. W rezultacie zawsze była wywoływana wersja z interfejsu, co prowadziło do nieprawidłowej logiki biznesowej podczas użytkowania.
Historia
Przy migracji metod pomocniczych z klasy do interfejsu część kodu używała wywołania przez obiekt:
obj.method(), co stało się niemożliwe, więc musiano refaktoryzować wywołania naInterfaceName.method()w całym projekcie.
Historia
Wsparcie dla starszych wersji Java doprowadziło do błędów kompilacji po dodaniu statycznych metod do interfejsów, programiści nie sprawdzili, która wersja kompilatora jest używana w CI, a proces budowania zaczął regularnie się psuć.