Da nicht alle Methodendeklarationen in einer Java-Schnittstelle öffentlich abstrakt sind, sollten die Methoden mit diesen Modifikatoren deklariert werden?

14

Ab Java 8 wurden defaultMethoden in Interfaces eingeführt. Im Endeffekt bedeutet dies, dass nicht alle Methoden in einem interfacesind abstract.

Ab Java 9 sind (möglicherweise) privateMethoden zulässig. Dies bedeutet, dass nicht alle Methoden in einem interfacesind public abstract.

Die Frage "Sollen Methoden in einer Java-Schnittstelle mit oder ohne den publicZugriffsmodifikator 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 abstractsie nicht verwendet werden sollten, da keine Methode in einem interfaceetwas anderes sein kann als public abstract. Das ist heute nicht mehr der Fall.

Sollten die public abstractSchlü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 abstractWeglassen 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.

David Campbell
quelle
5
Haben Sie Java 8 JLS überprüft? Aus demselben Abschnitt wie in der alten akzeptierten Antwort von SO geht hervor , dass die Einführung von Standardmethoden die vorherige Empfehlung nicht geändert hat, die auf denselben Überlegungen zur Redundanz beruhte: "Eine Schnittstellenmethode ohne defaultModifizierer oder staticModifizierer ist implizit abstract... Es ist zulässig, aber aus Gründen des Stils abgeraten, den abstractModifikator für eine solche Methodendeklaration redundant anzugeben . " Warum erwarten Sie, dass sich die Dinge ändern sollten?
gnat
3
Ich dachte, die Dinge könnten sich ändern, weil sich die Bedingungen für eine implizite Methode abstractzunehmend verwickeln. In Java 9, die gleichen Satz könnte sein : „Eine Interface - Methode einen fehlt defaultModifikator oder ein staticModifikator oder ein privateModifikator ist implizit abstrakt ...“ Darüber hinaus ist die Hilfs Argumente für nicht explizit die Schlüsselwörter, nämlich, dass alle Interface - Methoden sind public abstract, sind jetzt streitig.
David Campbell
TBH Ich verstehe die Argumentation hinter "Standard" -Methoden nicht, und selbst statische Methoden gehen über das hinaus, was Schnittstellen normalerweise tun sollen. Schnittstellen dürfen nicht mit Konkretion belegt werden. Deshalb sind sie nützliche Typen für Referenzen.
Trixie Wolf
1
@ TrixieWolf-Standardmethoden ermöglichen die Entwicklung von Schnittstellen. Zuvor und anders als bei Klassen führte das Hinzufügen einer Methode zu Fehlern bei jeder Implementierung. Jetzt können Sie eine Benutzeroberfläche erweitern, sofern Sie über einen guten Kandidatenstandard verfügen. Betrachten wir die Zugabe von streamzu java.util.Collectionoder Map.getOrDefault(). Alternativ können Sie ein neues Unter-Interface erstellen und alle zum Downcast bringen, wie Graphics2D, und niemand hat das genossen!
SusanW

Antworten:

2

So erweitern Sie die StackOverflow-Antwort:

  1. Der publicZugriffsmodifikator wird nicht benötigt, weil

    Jede Methodendeklaration im Hauptteil einer Schnittstelle ist implizit öffentlich (§6.6). Es ist zulässig, aber aus Gründen des Stils nicht ratsam, den öffentlichen Modifikator für eine Methodendeklaration in einer Schnittstelle redundant anzugeben. ( Abschnitt 9.4 )

  2. Der abstractZugriffsmodifikator wird nicht benötigt, weil

    Eine Standardmethode ist eine Methode, die in einer Schnittstelle mit dem Standardmodifikator deklariert ist . sein Körper wird immer durch einen Block dargestellt .

    Und...

    Eine Schnittstellenmethode ohne einen Standardmodifizierer oder einen statischen Modifizierer ist implizit abstrakt , sodass ihr Hauptteil durch ein Semikolon und nicht durch einen Block dargestellt wird.

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:

Lass sie nicht nachdenken! Ich habe immer ein öffentliches Abstract hinzugefügt, trotz der Art der Polizei, weil es die Dinge klar machte und den Leser erinnerte. Jetzt bin ich bestätigt, weil Java 8 und 9 die Dinge komplizieren (user949300)

Ein Kommentar zur StackOverflow-Frage (18-mal positiv bewertet) widerlegt dies:

Es ist schlecht, weil das Schreiben als öffentlich impliziert, dass es nicht öffentlich sein kann (Pacerier)

Die Auswirkungen von Code, insbesondere Schnittstellen, sind wichtig.

Greg Burghardt
quelle
Der von Ihnen in StackOverflow zitierte Kommentar ist jetzt veraltet. Es ist widersprüchlich zu sagen, dass das Hinzufügen des Modifizierers public schlecht geschrieben ist, da impliziert wird, dass er nicht öffentlich sein kann. Die Methode kann nicht öffentlich sein.
David Campbell
@ DavidCampbell: Nun, ich denke, diese Frage könnte besser gestellt werden, nachdem Java 9 herauskommt. :) Die Java-Spezifikation, deren Fertigstellung noch aussteht, könnte diese Frage beantworten.
Greg Burghardt
1

Reicht das Fehlen einer Blockanweisung nicht aus? Würden Sie erklären, extends Objectobwohl 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.

Vince Emigh
quelle
2
Lass sie nicht nachdenken! Ich habe immer public abstractvorher 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.
user949300
1
@ user949300 Würden Sie auch extends Objectzu jeder Klasse hinzufügen , die direkt von abgeleitet ist Object? 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 macht
Vince Emigh,
@ user949300 Auf diese Weise können Sie mit größerer Wahrscheinlichkeit Verwirrung darüber stiften, was es bedeutet, wenn Schnittstellenmethoden diese Deklarationen nicht enthalten. dh wenn Entwickler Java lernen, indem sie sich Ihren Code ansehen, haben Sie möglicherweise ihr Verständnis der Syntax von Schnittstellendeklarationen beeinträchtigt.
JimmyJames
Vince, nein, ich würde Object nicht erweitern, obwohl ich keinen Fit auslasse, wenn ich Code sehe, der dies tut. @JimmyJames, wenn man beständig öffentliche Zusammenfassungen zu Elementen hinzufügt, die so sind, sehe ich keine Verwirrung. Vermisse ich etwas? OTOH, ich verstehe deinen Standpunkt in Bezug auf Unordnung. Zum Beispiel füge ich keine finalArgumente vor der Methode hinzu, es sei denn, etwas Lustiges erfordert dies (wie eine anonyme innere Klasse usw.)
user949300
@ user949300 Er meint, wenn ein Benutzer bereits dem Mangel an Modifikatoren und dem Grund dafür ausgesetzt war, kann er sich fragen, warum die Modifikatoren vorhanden sind, wenn er sie sieht, und davon ausgehen, dass es einen tatsächlichen Grund dafür gibt, der nicht nur explizit ist . Ich würde keinen Anfall werfen, wenn ich extends Objectes 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 erstreckt Object, daher die explizite Erweiterung)
Vince Emigh,