Ist es eine gute Praxis, Unterdrückungswarnungen in Ihrem Code zu verwenden?

11

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.

Bilesh Ganguly
quelle
@gnat Sie sprechen nicht über ungeprüfte Typ Casts‽
Bilesh Ganguly
1
Sie tun Folgendes : "Viele unverzichtbare Java-Bibliotheken wurden nie aktualisiert, um die Notwendigkeit unsicherer Typecasts zu beseitigen. Das Unterdrücken dieser Warnungen ist erforderlich, damit andere wichtigere Warnungen bemerkt und korrigiert werden."
Mücke
2
Ich denke, das Problem mit diesem Duplikat ist, dass es sich um C # handelt - es gibt einige Java-spezifische Gründe, die sich von der allgemeinen Idee unterscheiden, Compiler-Warnungen zu unterdrücken.

Antworten:

26

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.

Kilian Foth
quelle
1
Ich stimme teilweise zu, dass das Starten von einem "sauberen" Slate Ihnen hilft, spätere Warnungen abzufangen. Tatsache ist, dass Code, der sauber kompiliert wird, möglicherweise nicht sauber ausgeführt wird.
user949300
Das Problem, das ich bei der Arbeit habe, ist, dass ich oft auf Warnungen stoße, die jemand anderes unterdrückte, weil er nicht verstand, was es sagte. Ich denke also, ob eine Warnung einen Wert hat, ist eine subjektive Angelegenheit. : /
Trejkaz
16

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

if (x = someFunction ()) { ... }

gibt aber eine Warnung

if ((x = someFunction ())) { ... }

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

if ((x = someFunction ()) != 0) { ... }

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.

gnasher729
quelle
2
Ich denke, in Ihrem zweiten und dritten Beispiel fehlt Ihnen möglicherweise eine abschließende Klammer.
8bittree
1
Perfekt mit dem letzten Satz einverstanden
usr-local-ΕΨΗΕΛΩΝ
7

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

user949300
quelle