Przeglądając Framework kolekcji Java, zauważyłem, że sporo interfejsów ma komentarz (optional operation). Te metody pozwalają na implementację klas, UnsupportedOperationExceptionjeśli nie chcą po prostu implementować tej metody.
Przykładem tego jest addAllmetoda 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 UnsupportedOperationExceptionrodzajem porażki? Oznacza to, że nie mogę już przejść Seti po prostu użyć addAll. Muszę raczej wiedzieć, jaką implementację Setprzeszedłem, więc mogę wiedzieć, czy mogę użyć, addAllczy 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.zipnim 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.
addAllwHashSet. Odsyła do domyślnej implementacji, wAbstractCollectionktórej z pewnością nie rzucaUnsupportedOperationException.