Ab Java 8 wurden default
Methoden in Interfaces eingeführt. Im Endeffekt bedeutet dies, dass nicht alle Methoden in einem interface
sind abstract
.
Ab Java 9 sind (möglicherweise) private
Methoden zulässig. Dies bedeutet, dass nicht alle Methoden in einem interface
sind public abstract
.
Die Frage "Sollen Methoden in einer Java-Schnittstelle mit oder ohne den public
Zugriffsmodifikator deklariert werden ?" wurde bei Stack Overflow unter /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-with-a-public-access-m gefragt
Dort argumentierten die meisten Antworten, dass public abstract
sie nicht verwendet werden sollten, da keine Methode in einem interface
etwas anderes sein kann als public abstract
. Das ist heute nicht mehr der Fall.
Sollten die public abstract
Schlüsselwörter angesichts dieser neuen Funktionen von Schnittstellen in einer Java-Deklaration für Schnittstellenmethoden verwendet werden?
In meiner spezifischen Umgebung werden wir Leute haben, die erfahrene Software-Ingenieure sind, aber keine Erfahrung mit Java haben und von Zeit zu Zeit Java-Code lesen. Ich bin der Meinung, dass das public abstract
Weglassen der Schlüsselwörter jetzt einen zusätzlichen Punkt der Verwirrung für diejenigen schafft, die nicht mit der Vorgeschichte vertraut sind, wie Schnittstellen zu unterschiedlichen Regeln für die Verwendung dieser Schlüsselwörter kamen.
quelle
default
Modifizierer oderstatic
Modifizierer ist implizitabstract
... Es ist zulässig, aber aus Gründen des Stils abgeraten, denabstract
Modifikator für eine solche Methodendeklaration redundant anzugeben . " Warum erwarten Sie, dass sich die Dinge ändern sollten?abstract
zunehmend verwickeln. In Java 9, die gleichen Satz könnte sein : „Eine Interface - Methode einen fehltdefault
Modifikator oder einstatic
Modifikator oder einprivate
Modifikator ist implizit abstrakt ...“ Darüber hinaus ist die Hilfs Argumente für nicht explizit die Schlüsselwörter, nämlich, dass alle Interface - Methoden sindpublic abstract
, sind jetzt streitig.stream
zujava.util.Collection
oderMap.getOrDefault()
. Alternativ können Sie ein neues Unter-Interface erstellen und alle zum Downcast bringen, wie Graphics2D, und niemand hat das genossen!Antworten:
So erweitern Sie die StackOverflow-Antwort:
Der
public
Zugriffsmodifikator wird nicht benötigt, weilDer
abstract
Zugriffsmodifikator wird nicht benötigt, weilUnd...
Da die Standardmethoden haben einen Körper, und diejenigen, die von Natur aus nicht abstrakt, und jede Methode Erklärung auf einer Schnittstelle ist von Natur aus öffentlich, Sie brauchen nicht so oder Keyword angeben.
Einer der Kommentare zu einer Antwort lautete:
Ein Kommentar zur StackOverflow-Frage (18-mal positiv bewertet) widerlegt dies:
Die Auswirkungen von Code, insbesondere Schnittstellen, sind wichtig.
quelle
Reicht das Fehlen einer Blockanweisung nicht aus? Würden Sie erklären,
extends Object
obwohl es impliziert ist?Wenn der Entwickler die Redundanz nicht versteht, kann es sein, dass er das Konzept hinter dem Sprachfeature nicht vollständig versteht. Dies ist ein noch größeres Problem, als sich über Modifikatoren im Klaren zu sein.
Der Entwickler muss verstehen, dass der Zweck einer Schnittstelle darin besteht, einen Vertrag zu erstellen, der definiert, wie ein Client mit einem Objekt interagieren kann. Dies legt nahe, dass alle Methoden in einer Schnittstelle, die für die Objektinteraktion verwendet werden, Clients zur Verfügung gestellt werden sollten.
Wenn Sie eine Methode als privat deklarieren, geben Sie explizit an, dass die Methode nicht von Clients aufgerufen werden soll. Dies ist im Fall von Schnittstellen etwas, das nicht einfach abgeleitet werden kann.
quelle
public abstract
vorher hinzugefügt , trotz der Stilpolizei, weil es die Dinge klar machte und den Leser erinnerte. Jetzt bin ich bestätigt, weil Java 8 und 9 die Dinge komplizieren :-). Java ist bereits überflüssig.extends Object
zu jeder Klasse hinzufügen , die direkt von abgeleitet istObject
? Diese Informationen sollten einem Entwickler bereits bekannt sein, weshalb auf sie geschlossen wird. Je weniger nutzlose Informationen auf dem Bildschirm angezeigt werden, desto einfacher ist es, die wichtigen Informationen zu verarbeiten. Hoffentlich habe ich dich überredet, auf die dunkle Seite zu kommen. Wenn nicht, war es einen Versuch wert, haha. Am Ende kommt es darauf an, was den Code für den Entwickler einfacher zu verwalten machtfinal
Argumente vor der Methode hinzu, es sei denn, etwas Lustiges erfordert dies (wie eine anonyme innere Klasse usw.)extends Object
es sehen würde, aber es würde definitiv eine Fahne hissen und mich fragen lassen, warum. Wie ich in diesem Beitrag erwähnt habe, könnte dies bedeuten, dass der Entwickler ein Missverständnis darüber hat, wie etwas funktioniert (möglicherweise wissen nicht alle Objekte, dass es sich bereits erstrecktObject
, daher die explizite Erweiterung)