Wir haben ein Java-Projekt. Wir aktivieren -Xlint
(aktivieren Warnungen) und -Werror
(behandeln Warnung als Fehler) Flags für javac
, um sicherzustellen, dass unser Code warnungsfrei ist. Vor kurzem haben wir beschlossen, eine Klasse abzulehnen. Das Problem besteht in einigen Fällen darin, dass @SuppressWarnings("deprecation")
die Verwarnungswarnung überhaupt nicht unterdrückt, was zu einem Buildfehler führt. Im Folgenden finden Sie eine Liste der Anwendungsfälle, die ich lief:Wie vermeidet man Abneigungswarnungen, wenn @SuppressWarnings ("deprecation") nicht funktioniert?
- Importiert in anderen nicht veralteten Klassen.
- Importiert in andere veraltete Klassen.
- Elternklasse.
Typ Parameter. Zum Beispiel
@SuppressWarnings("deprecation") public class Foo extends Bar<DeprecatedClass> { ... }
Dies hat jedoch eine keine Warnung auch ohne Unterdrückungs:
@Deprecated public class DeprecatedClass extends Bar<DeprecatedClass> { ... }
AFAIK gibt es keine Syntax für Kommentierung Importe, also für den Fall 1 und 2 unserer Lösung ist, Import * oder Import vermeiden. Für Fall 3 und 4 unterdrücken sowohl Java 6 als auch 7 die Warnung nicht. Java 8 wird es korrekt unterdrücken (vielleicht ist ein Fehler behoben). Bisher keine Lösung dafür.
Leider müssen wir Java 6, 7 und 8 an dieser Stelle unterstützen. Gibt es einen Weg, mit dem Problem umzugehen? Es ist eine Blockade für unsere Java-API-Entwicklung.
NACHTRAG
Viele Leute fragen, warum wir immer noch die veraltete Klasse in unserer eigenen Code-Basis verwenden. Der Grund ist, dass das Projekt eine Bibliothek ist, die viele verschiedene Kunden unterstützt. Bei der Einführung einer neuen Ersetzungs-API müssen wir zuerst unsere alte API deaktivieren, sie in unserer Codebasis behalten, auf die Migration aller Clients warten und sie dann entfernen. Es gibt drei gängige Anwendungsfälle:
- Wir verbitten Klasse
Foo
undBar
, woFoo
Bar
erstreckt. Dies ist der Fall 2 und 3 in meiner Frage. - Wir verwerfen Klasse
Foo
undBar
, wobeiFoo
erweitertCollection<Bar>
. Dies ist der Fall 2 und 4. - Wir müssen alle Test-Code für Klasse
Foo
undBar
halten. Der Testcode importiert diese Klassen. Dies ist der Fall 1.
Warum den Test halten? Vergessen Sie nicht, dass, wenn ein schwerwiegender Fehler (z. B. Speicherverlust, Sicherheitsproblem) entdeckt wird und die Clients nicht problemlos auf die neue Version migrieren können, wir weiterhin eine Fehlerbehebung für die alte API bereitstellen müssen. Und alle Änderungen müssen getestet werden.
Ich denke, dass unsere Situation in der Software-Bibliotheksentwicklung und API-Entwicklung relativ häufig vorkommen sollte. Überraschenderweise brauchte Java so lange (bis Java 8), um den Fehler zu beheben.
Es gibt wahrscheinlich nicht viele Möglichkeiten. Sie könnten Ihren Build-Prozess so ändern, dass kein "-Werror" außer target == 8 auftritt, oder veraltete Warnungen ausschließen, da dies in 6 und 7 zu brechen scheint. Oder Sie führen keine Standard-Abwertung durch (imo eine schlechte Alternative): Überspringen deprecation und die schlechte Klasse sofort entfernen, „deprecate“ durch eine Notiz aus, die im Internet/javadoc setzen, oder in dem Fall, dass jede Klasse, die es als Typ-Parameter verwendet, auch wenn es bei der veralteten Klasse bleiben würde würde auch verbitten Werke verschwinden. Auch http://stackoverflow.com/a/20909204/995891 in Bezug auf 1) und 2) – zapl
Ich denke deprecate nicht Fall 3 und setzen '@ deprecated' in Javadoc könnte der letzte Ausweg sein, wenn kein besserer Ansatz besteht. –
Da Sie verweisen sie Typ als nicht-Klasse, können Sie erweitern gattungsgemäße Verwendung und gegossen zu 'DeprecatedClass' später, mit einer Warnung Unterdrückung um die Besetzung? – CharlieS