È buona norma usare gli avvisi di soppressione nel codice?

7

Uso @SuppressWarnings("unchecked") e @SuppressWarnings("null") principalmente sopra i metodi per consentire la compilazione del codice senza alcun avviso, ma ho i miei dubbi. Trovato questa domanda di Stackoverflow. Jon Skeet ha scritto una risposta ad essa che trovo intrigante.

Secondo lui,

Sometimes Java generics just doesn't let you do what you want to, and you need to effectively tell the compiler that what you're doing really will be legal at execution time.

E se ci fosse la possibilità di lanciare un'eccezione? Quindi non sopprimere gli avvertimenti è una cattiva idea? Non dovrei essere consapevole dei luoghi in cui i problemi potrebbero emergere?

Inoltre, che succede se qualcun altro modifica il mio codice in un secondo momento e aggiunge alcune funzionalità discutibili senza rimuovere SuppressWarnings? Come può essere evitato e / o c'è qualche altra alternativa a questo?

Dovrei usare @SuppressWarnings("unchecked") e @SuppressWarnings("null") ?

Aggiornamento # 1

Per quanto riguarda i tipi di cast non selezionati, in base a questa risposta (evidenziata da @gnat nei commenti di seguito), la soppressione di questi avvisi è necessaria.

Many indispensible Java libraries have never been updated to eliminate the need for unsafe typecasts. Suppressing those warnings is necessary so that other more important warnings will be noticed and corrected.

In caso di soppressione di altri avvisi, ancora in un'area grigia.

Aggiornamento n. 2

Come per Oracle Docs (citato anche da alcune risposte di seguito ):

As a matter of style, programmers should always use this annotation on the most deeply nested element where it is effective. If you want to suppress a warning in a particular method, you should annotate that method rather than its class.

    
posta Bilesh Ganguly 23.06.2016 - 12:52
fonte

3 risposte

21

Per me, l'intero punto di sopprimere gli avvertimenti è di mantenere un "buono stato di salute" per il tuo progetto. Se sai che l'intero codice base viene compilato in modo pulito, è immediatamente evidente quando qualcuno fa qualcosa di sbagliato che fa apparire il primo avviso nell'elenco dei problemi. Puoi quindi correggere l'errore o sopprimerlo se puoi provare che è spurio.

Ma se hai 21 segnalazioni per iniziare, è molto più probabile che tu trascuri il 22 ° quando qualcuno lo causa, e non controlla che sia innocuo. Ciò significa che i problemi possono insinuarsi nel tuo codice base e non te ne accorgerai mai.

Gli avvertimenti sono utili informazioni. Assicurati di prestare attenzione a quelli che dicono la verità e filtrare quelli che non lo fanno. Non permettere alle persone di mescolare i due tipi in modo da perdere il tuo sistema di allerta precoce.

Modifica

Probabilmente dovrei chiarire che sopprimere un avvertimento che ha un merito è una cosa stupida da fare. Una fattura di buona salute che hai ottenuto con l'inganno non ha ovviamente alcun valore. Data la scelta, dovresti sempre risolvere il problema che il compilatore ha notato piuttosto che limitarti a chiudere gli occhi. Tuttavia, ci sono aree in cui il compilatore non può essere sicuro se qualcosa sarà un problema o meno (i generici di Java sono una di queste aree), e lì la scelta migliore è rivedere ciascuna di queste istanze e quindi sopprimere l'avvertimento in questo specifico luogo piuttosto piuttosto che disattivare questa classe di avvertimento del tutto e potenzialmente perdere una vera e propria.

    
risposta data 23.06.2016 - 12:59
fonte
14

Sopprimere gli avvertimenti è qualcosa che deve essere fatto con estrema cura.

Un avvertimento significa: il compilatore ha trovato qualcosa che sembra dannoso. Non significa che è dodgy, sembra proprio al compilatore. A volte hai un codice che sta perfettamente bene e ti dà un avvertimento. A volte lo aggiusti modificando leggermente il tuo codice. A volte il compilatore ha alcune funzionalità specifiche per questo scopo. Ad esempio, dove

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

dà un avvertimento ma

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

non lo fa. Nel primo caso un avvertimento assumendo che si possa intendere == e non =. Nel secondo caso nessun avviso perché le parentesi in più dicono al compilatore "So cosa sto facendo". Meglio, naturalmente, sarebbe

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

o utilizzando due linee.

E a volte, molto raramente, ci sono casi in cui il tuo codice va bene, ma non puoi riuscire a scriverlo in modo accettabile senza preavviso. In quel caso molto raro disabiliti un avviso per quella dichiarazione e accendilo subito dopo. Questa è l'ultima risorsa. E disabiliti solo quell'avvertimento specifico, nessun altro.

Tuttavia, alcune persone semplicemente disabilitano gli avvisi per sbarazzarsi degli avvertimenti, perché sono troppo pigri per scoprire e correggere prima il motivo di un avviso legittimo. Oppure non provano nemmeno a scrivere codice privo di avvisi. Questa è una cosa estremamente malsana da fare.

    
risposta data 23.06.2016 - 13:30
fonte
4

La sospensione dell'avviso per un intero metodo è sospetta. Meglio sopprimere gli avvertimenti per la linea specifica, con un commento . per es.

@SuppressWarnings("unchecked") Foo foo = (Foo)object; // Using old library requires this cast

    
risposta data 27.06.2016 - 07:37
fonte

Leggi altre domande sui tag