Ich verwende @SuppressWarnings("unchecked")
und @SuppressWarnings("null")
meistens die oben genannten Methoden, um den Code ohne Warnungen kompilieren zu lassen, aber ich habe meine Zweifel. Ich habe diese Stackoverflow- Frage gefunden . Jon Skeet hat eine Antwort darauf geschrieben, die mich fasziniert.
Laut ihm,
Manchmal lassen Sie Java-Generika einfach nicht tun, was Sie wollen, und Sie müssen dem Compiler effektiv mitteilen, dass das, was Sie tun, zur Ausführungszeit wirklich legal ist.
Aber was ist, wenn die Möglichkeit besteht, dass eine Ausnahme ausgelöst wird? Ist es dann nicht eine schlechte Idee, Warnungen zu unterdrücken? Sollte ich mir nicht der Orte bewusst sein, an denen Probleme auftreten könnten?
Was ist auch, wenn jemand anderes meinen Code später ändert und fragwürdige Funktionen hinzufügt, ohne SuppressWarnings zu entfernen? Wie kann das vermieden werden und / oder gibt es eine andere Alternative dazu?
Soll ich @SuppressWarnings("unchecked")
und verwenden @SuppressWarnings("null")
?
Update Nr. 1
In Bezug auf ungeprüfte Typumwandlungen ist gemäß dieser Antwort (auf die @gnat in den Kommentaren unten hingewiesen hat) die Unterdrückung dieser Warnungen erforderlich.
Viele unverzichtbare Java-Bibliotheken wurden nie aktualisiert, um unsichere Typecasts zu vermeiden. Das Unterdrücken dieser Warnungen ist erforderlich, damit andere wichtigere Warnungen bemerkt und korrigiert werden.
Im Falle der Unterdrückung anderer Warnungen immer noch in einer Grauzone.
Update Nr. 2
Gemäß Oracle Docs (auch in einigen Antworten unten erwähnt):
Aus Stilgründen sollten Programmierer diese Anmerkung immer für das am tiefsten verschachtelte Element verwenden, in dem sie wirksam ist. Wenn Sie eine Warnung in einer bestimmten Methode unterdrücken möchten, sollten Sie diese Methode und nicht ihre Klasse mit Anmerkungen versehen.
quelle
Antworten:
Für mich besteht der gesamte Sinn der Unterdrückung von Warnungen darin, ein "sauberes Gesundheitszeugnis" für Ihr Projekt aufrechtzuerhalten. Wenn Sie wissen, dass Ihre gesamte Codebasis sauber kompiliert wird, ist es sofort offensichtlich, wenn jemand etwas falsch macht, wodurch die erste Warnung in der Problemliste angezeigt wird. Sie können den Fehler dann beheben oder unterdrücken, wenn Sie nachweisen können, dass er falsch ist.
Wenn Sie jedoch zunächst 21 Warnungen haben, ist es viel wahrscheinlicher, dass Sie die 22. übersehen, wenn jemand sie verursacht, und Sie überprüfen nicht , ob sie harmlos ist. Das bedeutet, dass sich Probleme in Ihre Codebasis einschleichen können und Sie es nie bemerken werden.
Warnungen sind nützliche Informationen. Stellen Sie sicher, dass Sie diejenigen beachten, die die Wahrheit sagen, und diejenigen herausfiltern, die dies nicht tun. Lassen Sie nicht zu, dass sich die beiden Arten vermischen, damit Sie Ihr Frühwarnsystem verlieren.
Bearbeiten
Ich sollte wahrscheinlich klarstellen, dass es dumm ist, eine Warnung zu unterdrücken, die einen Wert hat. Ein sauberes Gesundheitszeugnis, das Sie durch Betrug erhalten haben, ist offensichtlich nichts wert. Wenn Sie die Wahl haben, sollten Sie immer das Problem beheben, das der Compiler bemerkt hat, anstatt nur die Augen davor zu schließen. Es gibt jedoch Bereiche, in denen der Compiler nicht sicher sein kann, ob ein Problem vorliegt oder nicht (Javas Generika sind ein solcher Bereich), und dort ist es besser, jede solche Instanz zu überprüfen und dann die Warnung an dieser bestimmten Stelle zu unterdrücken als diese Klasse von Warnungen ganz auszuschalten und möglicherweise eine echte zu verpassen.
quelle
Das Unterdrücken von Warnungen muss mit äußerster Sorgfalt erfolgen.
Eine Warnung bedeutet: Der Compiler hat etwas gefunden, das zwielichtig aussieht. Es bedeutet nicht , es ist vertrackt, es sieht aus wie es an den Compiler. Manchmal haben Sie Code, der vollkommen in Ordnung ist und eine Warnung ausgibt. Manchmal beheben Sie das Problem, indem Sie Ihren Code leicht ändern. Manchmal hat der Compiler eine spezielle Funktion für diesen Zweck. Zum Beispiel wo
gibt aber eine Warnung
nicht. Im ersten Fall eine Warnung unter der Annahme, dass Sie möglicherweise == und nicht = gemeint haben. Im zweiten Fall keine Warnung, da die zusätzlichen Klammern dem Compiler mitteilen, dass ich weiß, was ich tue. Besser wäre natürlich
oder mit zwei Zeilen.
Und manchmal, sehr selten, gibt es Fälle, in denen Ihr Code in Ordnung ist, Sie es jedoch nicht schaffen, ihn so zu schreiben, dass er ohne Vorwarnung akzeptiert wird. In diesem sehr, sehr seltenen Fall deaktivieren Sie eine Warnung für diese Anweisung und aktivieren sie sofort danach. Das ist ein letzter Ausweg. Und Sie deaktivieren nur diese spezielle Warnung, keine anderen.
Einige Leute deaktivieren jedoch nur Warnungen, um Warnungen zu entfernen, da sie zu faul sind, um den Grund für eine legitime Warnung zuerst herauszufinden und zu beheben. Oder sie versuchen nicht einmal, Code zu schreiben, der frei von Warnungen ist. Das ist eine extrem ungesunde Sache.
quelle
Das Unterdrücken der Warnung für eine gesamte Methode ist verdächtig. Es ist besser, die Warnungen für die jeweilige Zeile mit einem Kommentar zu unterdrücken . z.B
@SuppressWarnings("unchecked") Foo foo = (Foo)object; // Using old library requires this cast
quelle