wake-up-neo.net

Warum eine Schnittstelle als abstrakt deklarieren?

Was ist der Sinn, eine Schnittstelle als abstrakt zu deklarieren? Gleiches für eine Schnittstellenmethode. Gibt es einen Punkt dazu?

z.B.

public abstract interface Presenter {
 public abstract void go(final HasWidgets container);
}
49
Sudhir Jonathan

Wo haben Sie den Code gefunden, den Sie gepostet haben, eine alte Java-Codebasis?
Das muss der JLS sagen: 

9.1.1.1 abstract Schnittstellen:
Jedes Interface ist implizit abstrakt. Dieser Modifikator ist veraltet und sollte nicht in neuen Programmen verwendet werden.

9.4 Abstract Method Declarations:
Aus Gründen der Kompatibilität mit älteren Versionen der Java-Plattform ist es zulässig, jedoch __. Den abstrakten Modifikator Für in Schnittstellen deklarierte Methoden redundant anzugeben.

66
sateesh

Schnittstellen und Schnittstellenmethoden sind implizit abstract, auch wenn sie nicht als solche deklariert sind. Es muss also nicht explizit angegeben werden.

27
notnoop

Macht keinen Unterschied - Schnittstellen und Schnittstellenmethoden sind immer abstrakt, aber Sie müssen keinen Modifikator hinzufügen (und Schnittstellenmethoden sind immer öffentlich, sodass Sie nicht auch den öffentlichen Modifizierer benötigen).

Aus den JLS :

9.1.1.1 abstrakte Schnittstellen 

Jede Schnittstelle ist implizit abstrakt. Diese Modifikator ist veraltet und sollte nicht .__ sein. in neuen Programmen verwendet.

4
Andreas_D

Normalerweise deklarieren Sie das Interface oder seine Methoden nicht als abstrakt. Sie sind implizit.

Die Methoden sind auch öffentlich, so dass Sie auch das überspringen können. :-)

2
KLE

schau dir diesen Beitrag an

https://stackoverflow.com/questions/4380796/what-ispublic-abstract-interface-in-Java/4381308#4381308

schnittstelle ist% 100 abstrakte Klasse.

das Schlüsselwort abstract ist hier überflüssig

1
user467871

"Warum eine Schnittstelle als abstrakt deklarieren?" - Ich hatte die gleiche Frage und dachte, dass abstrakt überflüssig ist. Aber ich musste umdenken, als ich die Map-Schnittstelle in Java 1.8 sah. Möglicherweise muss dies in Java geändert werden 

//  (version 1.8 : 52.0, no super bit)
// Signature: <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;
public abstract interface Java.util.Map {

  // Method descriptor #1 ()I
  public abstract int size();
}
1

Der abstrakte Modifikator für eine Schnittstellenmethode ist ebenso wie der öffentliche Modifizierer redundant.

Der abstrakte Modifikator an der Schnittstelle selbst kann aus technischen Gründen überflüssig sein, da eine Schnittstelle niemals mit dem neuen Operator instanziiert werden kann und die Schnittstelle immer abstrakt ist, wenn sie über Reflektion gefragt wird.

Es kann jedoch ein semantischer Grund für die Deklaration eines Interface-Abstracts geben (der auch von verschiedenen UML-Tools unterstützt wird): Möglicherweise möchten Sie ausdrücken, dass ein Interface explizit als abstrakt deklariert wird, wie dies bei einer nicht abstrakten Klasse der Fall ist Implementieren Sie die Schnittstelle direkt, aber nur über eine Subschnittstelle ..__ Sie können den Schnittstellenknoten als semantisch abstrakt betrachten, während die Unterschnittstellen Ordner und Datei, die den Knoten erweitern, semantisch nicht abstrakt sind. Sie werden niemals eine Instanz haben, die nur ein Knoten ist - es wird entweder ein Ordner oder eine Datei sein.

Darüber hinaus gibt es Frameworks, die eine "Instantiierung" von Schnittstellen ermöglichen (technisch über dynamische Proxies). Einige Schnittstellen (z. B. eine vordefinierte Basisschnittstelle) dürfen nicht als Argument angeben. Zu Dokumentationszwecken kann es im Quellcode sinnvoll sein, den abstrakten Modifikator zum Ausdrücken solcher Informationen zu verwenden.

0
Jörg

Das Standardverhalten einer Schnittstelle entspricht im Wesentlichen dem, was Sie in Ihrem Beispiel haben. Die Definition als abstrakt ist nur überflüssig.

0
Zack Marrapese

Es gibt keinen Sinn, die Schnittstelle als abstrakt zu erklären. Da die Methoden in der Schnittstelle nur abstrakt sind, kann eine abstrakte Klasse sowohl konkrete als auch abstrakte Methoden haben, aber in der Schnittstelle sollten nur abstrakte Methoden vorhanden sein.

0
giri

Ich denke einfach nur Verbosessigkeit, Erklärungen und Konsistenz mit der Klassensyntax und Semantik ...

Das muss nicht sein, aber es könnte hilfreich sein, wenn ein Leser des Codes abgelenkt wird oder sich mit Java nicht auskennt.

0
fortran