Frage

Für Java-Programmierung, was sind einige Vorteile der @deprecated Notation der Verwendung auf und Interface-Methode aber nicht auf die Klasse, die sie implementiert?

public interface Joe {

    @Deprecated
    public void doSomething();

    ...
}

public final class Joseph implements Joe {

    public void doSomething() {
       ...
    }

    ...
}
War es hilfreich?

Lösung

Ich glaube, es ist ein Manko in der Java-Sprache selbst, und es ist Unsinn, ein Verfahren in einer Schnittstelle zu spezifizieren, wie über eine Anmerkung veraltete und nicht die Methode veraltete in der implementierenden Klasse betrachtet hat.

Es wäre besser, wenn die @ deprecated-ness des Verfahrens geerbt wurde. Leider scheint es, Java unterstützt dies nicht.

überlegen Sie, wie Werkzeuge, wie eine IDE, diese Situation behandelt: Wenn der Typ einer Variablen deklariert ist die Schnittstelle zu sein, dann @deprecated Methoden können durch mit einem Schlag gemacht werden. Aber wenn der Typ einer Variablen deklariert ist die implementierende Klasse zu sein, und die Klassensignatur schließt nicht @deprecated, dann wird das Verfahren ohne einen Durchschlag gemacht werden.

Die grundlegende Frage ist: Was ist das für ein Verfahren in einer Schnittstelle veraltet werden, aber nicht in einer implementierenden Klasse (oder in einer Erstreckungs Schnittstelle)? Die einzige vernünftige Absicht ist, dass das Verfahren für alles unterhalb der Schnittstelle in der Klassenhierarchie als veraltet zu sein. Aber die Sprache nicht, dass das Verhalten unterstützen.

Andere Tipps

@deprecated ist Dokumentation. Wenn die Menschen auf eine Schnittstelle codieren können Sie bestimmte Aspekte dieser Schnittstelle markieren als veraltet. Auf diese Weise die Menschen wissen nicht, es zu benutzen.

Die Implementierungsklasse der Schnittstelle ist ein Detail. Ein Verfahren in dieser Klasse geschieht die Schnittstelle zu erfüllen, kann aber nicht selbst als veraltet. kann diese Methode deprecating oder nicht geeignet sein.

Erstellen einer neuen Klasse, die eine Schnittstelle implementiert bedeutet, dass Sie die veralteten Methoden implementieren müssen. Sie sollten wahrscheinlich funktionieren, wenn Sie wissen, dass die Kunden der Klasse nicht die veralteten Methoden verwenden. Zum Beispiel, wenn Sie einen HTTP-Servlet-Container erstellen, müssen Sie die HttpServletResponse.encodeUrl() Methode implementieren, auch wenn es für encodeURL() veraltet ist. Das ist, weil ein Benutzer Ihrer Klasse, die veraltete Methode aufrufen kann.

meiner Meinung nach ist es umstritten : eine veraltete Methode Schnittstelle sollte nicht nicht unabhängig verwendet werden, es ist Implementierung (bitte counterexamples geben, wenn nicht)

Wenn wir den vorhandenen Code mit ungeeigneten Methoden in der Schnittstelle und bei der Umsetzung Refactoring wollen, dann können wir @Deprecated in den Interface-Methoden für saubere neue Methoden vorübergehend für einige Versionen verwenden. Es kann hässlich sein, nur den Code zu halten rückwärtskompatibel wir davon Gebrauch machen können. Dies wird zeigen, in dem IDE und SONAR-Bericht, dass es eine veraltete Methode und die Kunden zwingen, neue Methoden zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top