/ / Dlaczego dodanie domyślnych metod do interfejsów w Javie 8 jest dobrym wyborem projektowym i jakie są alternatywy [duplikat] - java, oop, interface, java-8

Dlaczego dodawanie domyślnych metod do interfejsów w Javie 8 jest dobrym wyborem projektu i jakie są alternatywy [duplicate] - java, oop, interface, java-8

Właśnie uczę się języka Java, więc trudno mi uzyskać dostęp do możliwych alternatyw i wpływu takiej decyzji projektowej.

Java 8 dodaje domyślne metody funkcja interfejsów, która pozwala interfejsom namieć wdrożenie. Pozwala to rozszerzyć istniejące interfejsy o nowe metody, bez niszczenia klientów, ewoluując z czasem interfejs w sposób kompatybilny wstecz. Jednak przy domyślnej implementacji takie rozszerzenia są nieco ograniczone i prawdopodobnie zostaną zaimplementowane przy użyciu istniejących metod interfejsu lub metod bibliotecznych. Więc moje pytanie brzmi

  • Dlaczego wprowadzono tę funkcję językową?
  • Jakie kluczowe nowe funkcje obsługuje? (na przykład Splititerators)
  • Jakie były inne możliwości obsługi tych funkcji językowych? Na przykład, dlaczego nie stworzyć nowego interfejsu SplitIterable, który rozszerza Iterable?
  • Jaki byłby wpływ wdrożenia tych alternatyw (upowszechnienie interfejsów?)
  • Czy powinienem zapewnić domyślną implementację metody w pierwszej edycji interfejsu, gdy możliwe jest zaimplementowanie jej jako zestawu innych metod?

Odpowiedzi:

11 dla odpowiedzi nr 1

Dlaczego wprowadzono tę funkcję językową?

Został dodany przede wszystkim w celu umożliwienia dodawania metodistniejące interfejsy, które są już w użyciu bez łamania kodu każdego, ale także do udostępniania implementacji metod „poziomo” między klasami implementującymi ten sam interfejs (w przeciwieństwie do udostępniania „wertykalnego” poprzez dziedziczenie).

Jakie kluczowe nowe funkcje obsługuje? (na przykład Splititerators)

java.util.Collection<T>.stream()

Jakie były inne możliwości obsługi tych funkcji językowych? Na przykład, dlaczego nie utworzyć nowego interfejsu SplitIterable to się rozszerza Iterable?

Możesz wybrać zupełnie nowe interfejsy i kontynuować z powiązaną statyczną klasą pomocnika (np. Collection<T> interfejs i jego Collections klasa pomocnicza). To nie byłoby okropne - w rzeczywistości można argumentować, że metody domyślne to czysto składniowy cukier oprócz metod statycznych*. Jednak domyślne metody zapewniają lepszą czytelność.

Jaki byłby wpływ wdrożenia tych alternatyw (rozprzestrzenianie interfejsów?)

Skończyłbyś się z mniej spójną biblioteką i mniej czytelnym językiem, ale nie byłby to koniec świata. Większy problem, jak wskazali Joachim Sauer, jest to, że implementacje interfejsu nie miałyby sposobu na zastąpienie implementacji ze statycznej klasy pomocniczej. To odebrałoby elastyczność.

Czy powinienem zapewnić domyślną implementację metody w pierwszej edycji interfejsu, gdy możliwe jest zaimplementowanie jej jako zestawu innych metod?

Powinieneś to zrobić tylko wtedy, gdy chcesz udostępnić implementację „poziomo”. Jeśli metoda zapewnia zasadnicze zachowanie implementacji, nie należy jej ustawiać domyślnie.

* Byłoby to nadmierne uproszczenie, ponieważ metody domyślne pozostają wirtualne. Dzięki Brian Goetz dla komentarza.