2012-10-09 2 views
9

Uso Eclipse, quindi il mio utilizzo dei commenti //$FALL-THROUGH$ è una pratica comune sulle istruzioni switch e simili. Ma il mio collega usa Netbeans e mi chiede cosa diavolo stavo facendo con questi. E provare a cercare qualcosa con un simbolo in google è come provare a tirare i denti con un paio di manopole congelate e senza strumenti ...

L'uso del commento //$FALL-THROUGH$, i segni del dollaro e tutto, una cosa java standard, o una sorta di magia di Eclipse? Se carico lo stesso codice in Netbeans o in un altro IDE, o lo eseguo attraverso il compilatore java autonomo, cadranno attraverso le istruzioni switch ancora contrassegnate con avvisi, anche con detto commento o no? Esiste un modo standard per fare ciò oltre all'utilizzo dell'annotazione @SupressWarning (che potrebbe semplicemente ingombrare il codice dato come lo si deve usare)?

+0

puoi dare un esempio di cosa fa questo commento? – RNJ

risposta

10

Le cose come questa sono IDE/dipendente dallo stile di controllo. Non ci sono "commenti Java standard".

(Beh, Javadocs sono standard, ma non controllare la compilazione/segnalazione degli errori.)

Una spiegazione del $FALL-THROUGH$ costrutto è menzionata in eclisse release documentation:

Il problema compilatore per i fall-through attesi nelle dichiarazioni caso-interruttore ora può essere soppresso precedendo la seguente dichiarazione del caso con un commento che inizia con $ FALL-THROUGH $. Questo è particolarmente interessante per il codice che non può utilizzare l'annotazione @SuppressWarnings ("fallthrough") in stile J2SE-5.0.

Si noti che i nomi di avviso per l'annotazione @Suppresswarnings dipendono dal compilatore e non sono uno standard di linguaggio Java.

+0

Ho pensato che avrei chiesto. Risposta finale: allora è magia di Eclipse. Sìì. : j – Tustin2121

3

Ho visto altri strumenti (ad esempio FindBugs) che utilizzano uno schema di commento simile. Ma nulla è standardizzato.

Nella maggior parte dei casi, questi avvisi vengono emessi solo quando l'istruzione case contiene il codice prima della caduta. Nella maggior parte dei casi, puoi evitarlo prendendo in considerazione il codice comune.

Per esempio, questo normalmente non innescare un avvertimento:

switch (foo) { 
    case 1: 
    case 2: 
    doSomething(); 
    break; 
    ... 
} 

ma questo sarebbe:

switch (foo) { 
    case 1: 
    doSomething(); 
    case 2: 
    doSomethingElse(); 
    break; 
    ... 
} 

Personalmente penso che gli avvertimenti sono lì per un motivo. Mi considero più leggibile (e sicuro) per il refactoring fuori codice comune e non hanno non vuoti fall-through:

switch (foo) { 
    case 1: 
    doSomething(); 
    doSomethingElse(); 
    break; 

    case 2: 
    doSomethingElse(); 
    break; 
    ... 
} 
+0

Sono a conoscenza di cosa causa l'avviso di fallthrough (in effetti ho attivato l'avviso su me stesso, poiché è disattivato per impostazione predefinita). Indipendentemente, +1 per coloro che non sanno di cosa sto parlando sopra.(Inoltre, preferisco di gran lunga usare i fallthrough piuttosto che ingombrare il mio codice con più metodi, specialmente uno che viene usato solo una volta in un metodo.) – Tustin2121

+0

È una questione di gusti, quindi non posso dichiarare esattamente che hai torto. Ti suggerirei di tenere a mente che, tra le molte cose che i programmatori possono fare male, questo è stato selezionato come qualcosa da mettere in guardia. La presenza o l'assenza di una "interruzione" dopo un blocco di codice in un'istruzione case è abbastanza difficile da eliminare quando si gestisce il codice di altre persone. –

+1

In C# questo tipo di scoperte non è nemmeno permesso perché ha un grande potenziale di bug (solo casi multipli prima di ogni tipo di istruzione) –

2

Questo commento è IDE specifico e non può riuscire con le altre pedine IDE e di codice, anche se findbugs è intelligente abbastanza per controllare i commenti con la parola cadere in loro. Ma, in ogni caso, non dovresti fare affidamento sui commenti per fare qualcosa di più che dirigere il collega programmatore, stai solo creando un'altra cosa da mantenere.