Czy metody w interfejsie Java powinny być deklarowane z public
modyfikatorem dostępu lub bez niego ?
Technicznie nie ma to oczywiście znaczenia. Metoda klasowa, która implementuje „an” interface
jest zawsze public
. Ale jaka jest lepsza konwencja?
Sama Java nie jest w tym spójna. Patrz na przykład Collection
vs. Comparable
lub Future
vs. ScriptEngine
.
java
interface
coding-style
public-method
Benno Richters
źródło
źródło
public
w tym kontekście nie należy go używać , domyślne metody interfejsu mogą teraz (w java 9) być prywatne. Sugeruję usunięcie komentarza, ponieważ jest przestarzały.public
.Odpowiedzi:
JLS czyni to jasne:
źródło
public
część jest taka sama,and/or abstract
część została usunięta)Modyfikator publiczny powinien zostać pominięty w interfejsach Java (moim zdaniem).
Ponieważ nie dodaje żadnych dodatkowych informacji, po prostu odwraca uwagę od ważnych rzeczy.
Większość przewodników po stylach zaleca, abyś je pomijał, ale oczywiście najważniejszą rzeczą jest zachowanie spójności w całej bazie kodu, a zwłaszcza dla każdego interfejsu. Poniższy przykład może łatwo pomylić osobę, która nie jest w 100% biegła w Javie:
źródło
Pomimo tego, że pytanie to zostało zadane dawno temu, ale uważam, że wyczerpujący opis wyjaśniłby, dlaczego nie ma potrzeby używania publicznego streszczenia przed metodami i publicznego statycznego finału przed stałymi interfejsem.
Przede wszystkim interfejsy służą do określania wspólnych metod dla zbioru niepowiązanych klas, dla których każda klasa będzie miała unikalną implementację. Dlatego nie można określić modyfikatora dostępu jako prywatnego, ponieważ nie można uzyskać do niego dostępu przez inne klasy, które mają zostać zastąpione.
Po drugie, chociaż można inicjować obiekty typu interfejsu, ale interfejs jest realizowany przez klasy, które go implementują i nie są dziedziczone. Ponieważ interfejs może zostać zaimplementowany (zrealizowany) przez różne niepowiązane klasy, które nie znajdują się w tym samym pakiecie, chroniony modyfikator dostępu również nie jest prawidłowy. Tak więc dla modyfikatora dostępu pozostaje nam tylko wybór publiczny.
Po trzecie, interfejs nie ma żadnej implementacji danych, w tym zmiennych i metod instancji. Jeśli istnieje logiczny powód, aby wstawić zaimplementowane metody lub zmienne instancji do interfejsu, musi to być nadklasa w hierarchii dziedziczenia, a nie interfejs. Biorąc to pod uwagę, ponieważ żadna metoda nie może być zaimplementowana w interfejsie, dlatego wszystkie metody w interfejsie muszą być abstrakcyjne.
Po czwarte, interfejs może zawierać tylko stałą jako elementy danych, co oznacza, że muszą one być ostateczne, a stałe końcowe są oczywiście deklarowane jako statyczne, aby zachować tylko jedną ich instancję. Dlatego statyczny finał jest również koniecznością dla stałych interfejsu.
Podsumowując, chociaż użycie publicznego abstraktu przed metodami i publicznego statycznego finału przed stałymi interfejsem jest poprawne, ale ponieważ nie ma innych opcji, uważa się je za zbędne i nieużywane.
źródło
Wraz z wprowadzeniem
private
,static
,default
modyfikatory dla metod interfejsu w Javie 8/9, robi się bardziej skomplikowane i mają tendencję do myślenia, że pełne deklaracje są bardziej czytelne (wymaga Java 9 skompilować):źródło
Unikałbym umieszczania modyfikatorów, które są stosowane domyślnie. Jak wskazano, może to prowadzić do niespójności i zamieszania.
Najgorsze, co widziałem, to interfejs z metodami zadeklarowanymi
abstract
...źródło
Użyłem metod deklaracji z
public
modyfikatorem, ponieważ dzięki temu kod jest bardziej czytelny, szczególnie z podświetlaniem składni. W naszym najnowszym projekcie zastosowaliśmy Checkstyle, który wyświetla ostrzeżenie z domyślną konfiguracjąpublic
modyfikatorów metod interfejsu, więc przełączyłem się na ich pominięcie.Nie jestem więc do końca pewien, co jest najlepsze, ale jedną rzeczą, której tak naprawdę nie lubię, jest używanie
public abstract
metod interfejsu. Eclipse robi to czasami podczas refaktoryzacji za pomocą „Extract Interface”.źródło
Zawsze piszę, czego bym użył, gdyby nie było interfejsu, i pisałem bezpośrednią implementację, tj
public
. Użyłbym .źródło
Wolę pomijać, czytam gdzieś, że interfejsy są domyślnie,
public
iabstract
.Ku mojemu zdziwieniu książka - Head First Design Patterns - używa
public
deklaracji interfejsu i metod interfejsu ... co skłoniło mnie do ponownego przemyślenia i wylądowałem na tym poście.W każdym razie uważam, że zbędne informacje należy zignorować.
źródło
public
modyfikator dostępu w deklaracji interfejsu, domyślnie nie będzie on publiczny i abstrakcyjny. docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.htmlNie zgadzam się z popularną odpowiedzią, że upublicznienie oznacza, że istnieją inne opcje i dlatego nie powinno tam być. Faktem jest, że teraz w Javie 9 i poza nią istnieją inne opcje.
Myślę, że zamiast tego Java powinna wymusić / wymagać określenia „public”. Dlaczego? Ponieważ brak modyfikatora oznacza dostęp do „pakietu” wszędzie indziej, a posiadanie go jako specjalnego przypadku prowadzi do zamieszania. Jeśli po prostu popełniłeś błąd kompilacji z wyraźnym komunikatem (np. „Dostęp do pakietu nie jest dozwolony w interfejsie.”), Pozbylibyśmy się pozornej niejednoznaczności, jaką daje możliwość pominięcia „publicznego”.
Zwróć uwagę na obecne sformułowanie: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4
Zobacz, że „prywatny” jest teraz dozwolony. Myślę, że ostatnie zdanie powinno zostać usunięte z JLS. To niefortunne, że zachowanie „niejawnie publiczne” było kiedykolwiek dozwolone, ponieważ prawdopodobnie pozostanie dla wstecznej kompatybilności i doprowadzi do zamieszania, że brak modyfikatora dostępu oznacza „publiczny” w interfejsach i „pakiet” gdzie indziej.
źródło
Powód, dla którego metody w interfejsach są domyślnie publiczne i abstrakcyjne, wydaje mi się dość logiczne i oczywiste.
Metoda w interfejsie jest domyślnie abstrakcyjna, aby zmusić klasę implementującą do zapewnienia implementacji, i domyślnie jest publiczna, więc klasa implementująca ma do tego dostęp.
Dodanie tych modyfikatorów do kodu jest zbędne i bezużyteczne i może jedynie prowadzić do wniosku, że brakuje Ci wiedzy i / lub zrozumienia podstaw języka Java.
źródło
To jest całkowicie subiektywne. Pomijam redundantny
public
modyfikator, ponieważ wydaje się, że jest bałaganem. Jak wspomnieli inni - konsekwencja jest kluczem do tej decyzji.Warto zauważyć, że projektanci języka C # postanowili to wymusić. Zadeklarowanie metody interfejsu jako publicznej w języku C # jest w rzeczywistości błędem kompilacji. Spójność prawdopodobnie nie jest jednak ważna we wszystkich językach, więc myślę, że nie jest to tak naprawdę bezpośrednio związane z Javą.
źródło
Ludzie będą uczyć się twojego interfejsu z uzupełniania kodu w IDE lub Javadoc, a nie z czytania źródła. Nie ma więc sensu umieszczać słowa „public” w źródle - nikt nie czyta źródła.
źródło
public
modyfikatora dostępu do interfejsu. Jest to zgodne z projektem i po dokładnym przemyśleniu.