Jedną z najbardziej przydatnych funkcji Java 8 są nowe default
metody interfejsów. Istnieją zasadniczo dwa powody (mogą być inne), dlaczego zostały wprowadzone:
- Zapewnienie rzeczywistych domyślnych implementacji. Przykład:
Iterator.remove()
- Zezwolenie na ewolucję API JDK. Przykład:
Iterable.forEach()
Z punktu widzenia projektanta API chciałbym móc korzystać z innych modyfikatorów metod interfejsu, np final
. Przydałoby się to podczas dodawania metod wygody, zapobiegając „przypadkowym” zastąpieniom przy wdrażaniu klas:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Powyższe jest już powszechną praktyką, gdyby Sender
były klasą:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
Teraz default
i final
oczywiście są oczywiście sprzeczne słowa kluczowe, ale samo domyślne słowo kluczowe nie byłoby ściśle wymagane , więc zakładam, że ta sprzeczność jest umyślna, aby odzwierciedlić subtelne różnice między „metodami klasy z ciałem” (tylko metody) a „interfejsem” metody z ciałem ” (metody domyślne), tj. różnice, których jeszcze nie rozumiałem.
W pewnym momencie obsługa modyfikatorów takich jak static
i final
metod interfejsu nie została jeszcze w pełni zbadana, powołując się na Briana Goetza :
Drugą częścią jest to, jak daleko posuniemy się do wspierania narzędzi do budowania klas w interfejsach, takich jak metody końcowe, metody prywatne, metody chronione, metody statyczne itp. Odpowiedź brzmi: jeszcze nie wiemy
Od tego czasu pod koniec 2011 roku static
dodano oczywiście obsługę metod w interfejsach. Najwyraźniej dodało to wiele wartości do samych bibliotek JDK, takich jak with Comparator.comparing()
.
Pytanie:
Jaki jest powód final
(i także static final
), że nigdy nie dotarł do interfejsów Java 8?
final
zapobiega to zastąpieniu metody i widząc, jak MUSISZ przesłonić metody odziedziczone z interfejsów, nie rozumiem, dlaczego miałoby sens nadać jej ostateczność. Chyba że miałoby to oznaczać, że metoda jest ostateczna PO PRZECIWCIENIU jej raz .. W takim przypadku może być jakieś trudności? Jeśli nie rozumiem tego prawa, pozwól mi kmow. Wydaje się interesujące
final
się w tym przypadku zapobieganie zastąpieniu przez klasę domyślną implementację metody interfejsu.