Sollten Methoden in einer Java-Schnittstelle mit oder ohne public
Zugriffsmodifikator deklariert werden ?
Technisch spielt es natürlich keine Rolle. Eine Klassenmethode, die ein implementiert, interface
ist immer public
. Aber was ist eine bessere Konvention?
Java selbst ist darin nicht konsistent. Siehe zum Beispiel Collection
gegenüber Comparable
oder Future
gegenüber ScriptEngine
.
java
interface
coding-style
public-method
Benno Richters
quelle
quelle
public
in diesem Zusammenhang Methoden Standard - Schnittstelle können jetzt (mit Java - 9) werden privat. Ich schlage vor, Sie entfernen Ihren Kommentar, da er veraltet ist.public
.Antworten:
Das JLS macht dies klar:
quelle
public
Teil ist gleich,and/or abstract
Teil wurde fallen gelassen)Der öffentliche Modifikator sollte in Java-Interfaces weggelassen werden (meiner Meinung nach).
Da keine zusätzlichen Informationen hinzugefügt werden, wird die Aufmerksamkeit nur von den wichtigen Dingen abgelenkt.
Die meisten Style-Guides empfehlen, dass Sie es weglassen, aber das Wichtigste ist natürlich, dass Sie in Ihrer Codebasis und insbesondere für jede Benutzeroberfläche konsistent sind. Das folgende Beispiel könnte leicht jemanden verwirren, der Java nicht zu 100% fließend spricht:
quelle
Trotz der Tatsache, dass diese Frage vor langer Zeit gestellt wurde, würde eine umfassende Beschreibung meiner Meinung nach klarstellen, warum es nicht erforderlich ist, public abstract vor Methoden und public static final vor Konstanten einer Schnittstelle zu verwenden.
Zunächst werden Schnittstellen verwendet, um allgemeine Methoden für eine Reihe nicht verwandter Klassen anzugeben, für die jede Klasse eine eindeutige Implementierung hat. Daher ist es nicht möglich, den Zugriffsmodifikator als privat anzugeben, da andere Klassen, auf die überschrieben werden soll, nicht auf ihn zugreifen können.
Zweitens kann man zwar Objekte eines Schnittstellentyps initiieren, aber eine Schnittstelle wird von den Klassen realisiert, die sie implementieren und nicht vererbt. Und da eine Schnittstelle möglicherweise von verschiedenen nicht verwandten Klassen implementiert (realisiert) wird, die sich nicht im selben Paket befinden, ist der Modifikator für geschützten Zugriff ebenfalls nicht gültig. Für den Zugriffsmodifikator bleibt uns also nur die öffentliche Wahl.
Drittens hat eine Schnittstelle keine Datenimplementierung, einschließlich der Instanzvariablen und -methoden. Wenn es einen logischen Grund gibt, implementierte Methoden oder Instanzvariablen in eine Schnittstelle einzufügen, muss es sich um eine Oberklasse in einer Vererbungshierarchie und nicht um eine Schnittstelle handeln. In Anbetracht dieser Tatsache müssen alle Methoden in der Schnittstelle abstrakt sein, da keine Methode in einer Schnittstelle implementiert werden kann.
Viertens kann Interface nur Konstanten als Datenelemente enthalten, was bedeutet, dass sie endgültig sein müssen und natürlich Endkonstanten als statisch deklariert werden, um nur eine Instanz von ihnen zu behalten. Daher ist das statische Finale auch ein Muss für Schnittstellenkonstanten.
Zusammenfassend lässt sich sagen, dass die Verwendung von public abstract vor Methoden und public static final vor Konstanten einer Schnittstelle gültig ist, aber da es keine anderen Optionen gibt, wird sie als redundant betrachtet und nicht verwendet.
quelle
Mit der Einführung von
private
,static
,default
Modifikatoren für Interface - Methoden in Java 8/9, werden die Dinge komplizierter und ich neige dazu zu denken , dass die vollständigen Erklärungen besser lesbar sind (benötigt Java 9 zu kompilieren):quelle
Ich würde es vermeiden, Modifikatoren einzufügen, die standardmäßig angewendet werden. Wie bereits erwähnt, kann dies zu Inkonsistenzen und Verwirrung führen.
Das Schlimmste, was ich gesehen habe, ist eine Schnittstelle mit deklarierten Methoden
abstract
...quelle
Ich habe Deklarationsmethoden mit dem
public
Modifikator verwendet, weil dadurch der Code besser lesbar wird, insbesondere bei der Hervorhebung der Syntax. In unserem neuesten Projekt haben wir jedoch Checkstyle verwendet, das eine Warnung mit der Standardkonfiguration fürpublic
Modifikatoren für Schnittstellenmethoden anzeigt. Daher habe ich darauf umgestellt, diese zu deaktivieren.Ich bin mir also nicht sicher, was am besten ist, aber eine Sache, die ich wirklich nicht mag, ist die Verwendung
public abstract
von Schnittstellenmethoden. Eclipse tut dies manchmal beim Refactoring mit "Schnittstelle extrahieren".quelle
Ich schreibe immer, was ich verwenden würde, wenn es keine Schnittstelle gäbe, und ich schreibe eine direkte Implementierung, dh ich würde verwenden
public
.quelle
Ich überspringe es lieber, ich lese irgendwo, dass Schnittstellen standardmäßig sind,
public
undabstract
.Zu meiner Überraschung verwendet das Buch - Head First Design Patterns -
public
Schnittstellendeklarationen und Schnittstellenmethoden ... das hat mich noch einmal zum Umdenken gebracht und ich bin auf diesem Beitrag gelandet.Ich denke, redundante Informationen sollten ignoriert werden.
quelle
public
Zugriffsmodifikator in der Schnittstellendeklaration weglassen, ist er standardmäßig nicht öffentlich und abstrakt. docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.htmlIch bin mit der populären Antwort nicht einverstanden, dass Öffentlichkeit impliziert, dass es andere Optionen gibt und es daher nicht geben sollte. Tatsache ist, dass es jetzt mit Java 9 und darüber hinaus andere Optionen gibt.
Ich denke stattdessen sollte Java die Angabe von 'public' erzwingen / verlangen. Warum? Weil das Fehlen eines Modifikators überall sonst "Paket" -Zugriff bedeutet und dies als Sonderfall gilt, führt dies zu Verwirrung. Wenn Sie es einfach zu einem Kompilierungsfehler mit einer eindeutigen Meldung machen würden (z. B. "Paketzugriff ist in einer Schnittstelle nicht zulässig."), Werden wir die offensichtliche Unklarheit beseitigen, die sich aus der Option ergibt, "öffentlich" wegzulassen.
Beachten Sie den aktuellen Wortlaut unter: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4
Sehen Sie, dass "privat" jetzt erlaubt ist. Ich denke, der letzte Satz hätte aus dem JLS entfernt werden sollen. Es ist bedauerlich, dass das "implizit öffentliche" Verhalten jemals zugelassen wurde, da es nun wahrscheinlich aus Gründen der Abwärtskompatibilität bestehen bleibt und zu der Verwirrung führt, dass das Fehlen des Zugriffsmodifikators "öffentlich" in Schnittstellen und "Paket" an anderer Stelle bedeutet.
quelle
Der Grund dafür, dass Methoden in Schnittstellen standardmäßig öffentlich und abstrakt sind, erscheint mir ziemlich logisch und offensichtlich.
Eine Methode in einer Schnittstelle, die standardmäßig abstrakt ist, um die implementierende Klasse zur Bereitstellung einer Implementierung zu zwingen, ist standardmäßig öffentlich, sodass die implementierende Klasse Zugriff darauf hat.
Das Hinzufügen dieser Modifikatoren zu Ihrem Code ist redundant und nutzlos und kann nur zu dem Schluss führen, dass Ihnen Kenntnisse und / oder Verständnis der Java-Grundlagen fehlen.
quelle
Es ist total subjektiv. Ich lasse den redundanten
public
Modifikator weg, da es wie Unordnung erscheint. Wie von anderen erwähnt, ist Konsistenz der Schlüssel zu dieser Entscheidung.Es ist interessant festzustellen, dass die C # -Sprachendesigner beschlossen haben, dies durchzusetzen. Das Deklarieren einer Schnittstellenmethode als öffentlich in C # ist tatsächlich ein Kompilierungsfehler. Konsistenz ist wahrscheinlich nicht sprachübergreifend wichtig, daher denke ich, dass dies für Java nicht wirklich direkt relevant ist.
quelle
Die Benutzer lernen Ihre Benutzeroberfläche anhand der Code-Vervollständigung in ihrer IDE oder in Javadoc und nicht anhand des Lesens der Quelle. Es macht also keinen Sinn, "öffentlich" in die Quelle zu setzen - niemand liest die Quelle.
quelle
public
einer Schnittstelle kein Zugriffsmodifikator hinzugefügt wird. Es ist beabsichtigt und nach sorgfältiger Überlegung dahinter.