Przeglądając Framework kolekcji Java, zauważyłem, że sporo interfejsów ma komentarz (optional operation)
. Te metody pozwalają na implementację klas, UnsupportedOperationException
jeśli nie chcą po prostu implementować tej metody.
Przykładem tego jest addAll
metoda w Set Interface
.
Teraz, jak stwierdzono w tej serii pytań, interfejsy są definiującą umową dotyczącą tego, czego może oczekiwać użycie.
Interfejsy są ważne, ponieważ oddzielają to, co robi klasa od tego, jak to robi. Umowa określająca, czego może oczekiwać klient, pozostawia deweloperowi swobodę wdrażania go w dowolny sposób, pod warunkiem przestrzegania umowy.
i
Interfejs to opis działań, które może wykonywać obiekt ... na przykład po naciśnięciu przełącznika światła światło się zapala, nie obchodzi cię, jak to działa. W programowaniu obiektowym interfejs to opis wszystkich funkcji, które musi posiadać obiekt, aby mógł być „X”.
i
Myślę, że podejście oparte na interfejsie jest znacznie ładniejsze. Następnie możesz ładnie wyśmiewać swoje zależności i wszystko jest zasadniczo mniej ściśle powiązane.
Interfejs + rozszerzenie (mixin) vs klasa podstawowa
Biorąc pod uwagę, że celem interfejsów jest zdefiniowanie kontraktu i luźne powiązanie twoich zależności, czy posiadanie niektórych metod nie jest UnsupportedOperationException
rodzajem porażki? Oznacza to, że nie mogę już przejść Set
i po prostu użyć addAll
. Muszę raczej wiedzieć, jaką implementację Set
przeszedłem, więc mogę wiedzieć, czy mogę użyć, addAll
czy nie. To wydaje mi się dość bezwartościowe.
Jaki jest więc sens UnsupportedOperationException
? Czy to po prostu rekompensowanie starszego kodu i muszą wyczyścić swoje interfejsy? Czy może ma sens bardziej sensowny, że tęsknię?
src.zip
nim połączone , działa świetnie. Pomaga dokładnie wiedzieć, jaki kod JRE czasami uruchamia, i nie odsuwać się do JavaDoc, który może być nieco gadatliwy.
addAll
wHashSet
. Odsyła do domyślnej implementacji, wAbstractCollection
której z pewnością nie rzucaUnsupportedOperationException
.