Począwszy od Java 8, default
metody zostały wprowadzone do interfejsów. W efekcie oznacza to, że nie wszystkie metody interface
są abstract
.
Począwszy od Java 9 (być może), private
metody będą dozwolone. Oznacza to, że nie wszystkie metody interface
są public abstract
.
Pytanie „Czy metody w interfejsie Java powinny być deklarowane z public
modyfikatorem dostępu lub bez niego ?” został zapytany w Stack Overflow na /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m
Tam większość odpowiedzi twierdziła, że public abstract
nie należy ich używać, ponieważ żadna metoda w nie interface
może być inna niż public abstract
. Tak już nie jest.
Czy w związku z tymi nowymi funkcjami interfejsów należy public abstract
używać słów kluczowych w deklaracji metody interfejsu Java?
W moim specyficznym środowisku będziemy mieć ludzi, którzy są doświadczonymi inżynierami oprogramowania, ale nie mają doświadczenia w Javie, od czasu do czasu czytając kod Java. Wydaje mi się, że pominięcie public abstract
słów kluczowych stworzy dodatkowy zamieszanie dla osób, które nie są zaznajomione z historią tego, jak interfejsy mają różne reguły korzystania z tych słów kluczowych.
źródło
default
modyfikatora lubstatic
modyfikatora jest domyślnieabstract
... Jest dozwolona, ale odradzane ze względu na styl, aby nadmiarowo określaćabstract
modyfikator takiej deklaracji metody. ” Dlaczego oczekujesz, że wszystko się zmieni?abstract
stają się coraz bardziej skomplikowane. W Javie 9 to samo zdanie może brzmieć: „Metoda interfejsu pozbawionadefault
modyfikatora lubstatic
modyfikatora lubprivate
modyfikatora jest domyślnie abstrakcyjna ...” Ponadto dodatkowe argumenty przemawiające za tym, aby nie używać słów kluczowych, a mianowicie, że wszystkie metody interfejsu sąpublic abstract
, są teraz dyskusyjne.stream
dojava.util.Collection
lubMap.getOrDefault()
. Alternatywą jest stworzenie nowego pod-interfejsu i zachęcenie wszystkich do spowolnienia, takich jak Graphics2D, i nikomu się to nie podobało!Odpowiedzi:
Aby rozwinąć odpowiedź StackOverflow:
public
Modyfikator dostępu nie jest potrzebna, ponieważabstract
Modyfikator dostępu nie jest potrzebna, ponieważI...
Biorąc pod uwagę, że metody domyślne mają treść, a te, które nie są z natury abstrakcyjne, a każda deklaracja metody w interfejsie jest z natury jawna, nie trzeba określać żadnego słowa kluczowego.
Jeden z komentarzy do odpowiedzi brzmiał:
Komentarz do pytania StackOverflow (głosowany w górę 18 razy) obala to:
Znaczenie implikacji kodu, zwłaszcza interfejsów, jest ważne.
źródło
Czy nie wystarczy brak implikacji instrukcji blokowej? Czy zadeklarowałbyś,
extends Object
choć jest to dorozumiane?Jeśli programista nie zrozumie redundancji, istnieje duże prawdopodobieństwo , że nie w pełni zrozumieją koncepcję funkcji językowej , co stanowi jeszcze większy problem niż dezorientacja w zakresie modyfikatorów.
Deweloper musi zrozumieć, że celem interfejsu jest utworzenie umowy określającej sposób interakcji klienta z obiektem. Sugeruje to, że każda metoda interfejsu używana do interakcji z obiektami powinna być dostępna dla klientów.
Jeśli deklarujesz metodę jako prywatną, wyraźnie stwierdzasz, że metoda ta nie powinna być wywoływana przez klientów, co w przypadku interfejsów jest czymś, czego nie można łatwo wywnioskować.
źródło
public abstract
wcześniej, pomimo stylu policji, bo to wszystko wyjaśniło i przypomniało czytelnikowi. Teraz jestem usprawiedliwiony, ponieważ Java 8 i 9 komplikują rzeczy :-). Java jest już dużo redundantna.extends Object
do każdej klasy, z której bezpośrednio pochodziObject
? Są to informacje, o których deweloper powinien już wiedzieć, i dlatego są one wywnioskowane. Im mniej bezużyteczne informacje na ekranie, tym łatwiej jest przetwarzać ważne informacje. Mam nadzieję, że przekonałem cię do przejścia na ciemną stronę (rozumiesz? Bo nie można zobaczyć ukrytych rzeczy). Jeśli nie, warto było spróbować haha. Ostatecznie sprowadza się to do tego, co ułatwia zarządzanie kodem dla programistyfinal
argumentów metody przed, chyba że wymaga tego coś zabawnego (jak anonimowa klasa wewnętrzna itp.)extends Object
, ale na pewno podniosłoby flagę i skłoniło mnie do pytania, dlaczego. Jak wspomniałem w poście, robienie takich rzeczy może sugerować, że deweloper może mieć niezrozumienie tego, jak coś działa (może nie wiedzieć, że wszystkie obiekty już się rozszerzająObject
, stąd wyraźne rozszerzenie)