2008-09-28 12 views
18

Ich kann keinen Anwendungsfall finden, um Schnittstellen in Java annotieren zu können.Anmerkungen zu Interfaces?

Vielleicht könnte mir jemand ein Beispiel geben?

+8

Es ist großartig, um den JavaScript-Typ zu verpissen, der versucht, Ihr Java zu verstehen. –

Antwort

20

Ich habe es im Frühling verwendet, um Schnittstellen zu kommentieren, wo die Anmerkung für alle Unterklassen gelten sollte. Angenommen, Sie verfügen über eine Service-Schnittstelle, und Sie verfügen möglicherweise über mehrere Implementierungen der Schnittstelle, möchten jedoch, dass eine Sicherheitsannotation unabhängig von der Annotation angewendet wird. In diesem Fall ist es am sinnvollsten, die Schnittstelle mit Anmerkungen zu versehen.

+0

Genauer gesagt ist @Transactional, das Sie auf eine Spring-Bean-Klasse anwenden können, auf jede ihrer Methoden oder auf die Schnittstellen- oder Schnittstellenmethoden, die die Klasse implementiert, was zu diesem Zeitpunkt am besten ist. – skaffman

+3

@Alex Nicht sicher, ob ich deine Antwort missverstanden habe, aber nach [dieser Frage] (http://stackoverflow.com/questions/4745798/why-java-classes-do-not-inherit-annotations-von-implementiert- Interfaces) werden Annotationen nicht von Interfaces vererbt. Beziehen Sie sich vielleicht auf Annotationen von Superklassen statt auf Schnittstellen? –

1

Mehr ein Beispiel, aber Local und Remote Anmerkungen in EJB3. Nach dem Java-doc,

Wenn auf einer Schnittstelle verwendet wird, bezeichnet dass Schnittstelle als lokale Schnittstelle.

Ich denke, der Anwendungsfall hier ist, dass die Schnittstelle eine spezielle Funktion am besten durch eine Anmerkung bezeichnet hat.

0

Sie könnten es für die Vertragsart Programmierung verwenden - gehen Sie einen Schritt weiter als nur die Schnittstelle (Typen und Methodennamen) definieren und auch einige Semantiken (Inhalt der Typen, Voraussetzungen, Nachbedingungen) definieren.

Ich habe prüfen würde, wie Annotationen in Java arbeiten zwar, aber diese Dinge mit Python Anmerkungen leicht getan werden könnte ...

4

Ich benutze findbugs ausgiebig. Ich finde die Verwendung von annotations Nulity-Einschränkungen sehr nützlich zu spezifizieren. Selbst wenn Sie Findbugs nicht verwenden, macht es die Absicht des Codes viel klarer. Diese Anmerkungen haben ihren Platz in Interfaces ebenso wie in Klassen. Sie könnten argumentieren, dass es eine Art der Programmierung nach Vertrag ist ...

1

Ich habe eine Menge von Forschungstools Verwendung Methode Annotationen gesehen, um Benutzern zu ermöglichen, Protokolle, Einschränkungen usw. zu spezifizieren, um die automatische Überprüfung später zu erleichtern.

Da Anmerkungen nicht vorschreiben, was Sie damit tun können, gibt es keinen guten Grund, Benutzern nicht zu erlauben, Schnittstellen zu kommentieren.

4

Auch ohne Beispiele sollte es klar sein zu erklären - Schnittstellen beschreiben Verhalten, und so können Anmerkungen, so ist es eine logische Übereinstimmung, sie zusammen zu setzen.

0

Bei der Bereitstellung von Anwendungen unter JBoss können Sie Anmerkungen auf einer Schnittstelle verwenden, um einen Dienst in der jmx-Konsole zu exportieren.

0

Ich habe es beim Definieren einer REST-Schnittstelle verwendet. Resteasy können Sie REST-Client erstellen, die eine kommentierte Schnittstelle (RESTInterfaceV1 in diesem Beispiel) verwendet:

final RESTInterfaceV1 client = ProxyFactory.create(RESTInterfaceV1.class, "http://localhost:8080/rest"); 

Obwohl die Anmerkungen auf dem Objekt dupliziert werden müssen, die tatsächlich die REST-Schnittstelle implementiert, die Schnittstelle selbst kann separat verteilt werden diejenigen, die einen Java-REST-Client erstellen möchten.

0

Ich markiere meine Schnittstellen mit @Immutable, um Entwicklern von Unterklassen klar zu zeigen, welchen Mutabilitätsvertrag eine Klasse haben soll, die die Schnittstelle implementiert. Wie gehel es ausdrückt, Programmierung per Vertrag.

4

Ein Anwendungsfall, mit dem ich arbeite, ist die javax/hibernate-Bean-Validierung. Wir verwenden Schnittstellen, um uns dabei zu helfen, Validierungen für jede spezifische Klasse zu definieren.

public interface IUser { 
    @NotNull Long getUserId(); 
    ... 
} 

public class WebUser implements IUser { 
    private Long userId; 

    @Override 
    public Long getUserId(){ 
     return userId; 
    } 
    ... 
}