2012-01-31 10 views
10

Ho recentemente installato il plug-in Checkstyle per Eclipse e personalmente penso che sia fantastico. Ma uno degli avvertimenti che mi dà è un po 'oscuro. L'avvertimento esatto è "L'utilizzo di ++ non è consentito". Si tratta di postfix ++ in qualche fila comePerché l'utilizzo dell'incremento del prefisso è considerato migliore dell'incremento postfisso nello standard per la costruzione

for(int i = 0; i < SOMETHING; i++) 

Ok, sto consapevoli che foreach è la costruzione di meglio per l'iterazione, ma non può essere applicato ovunque, a volte della vecchia scuola ++ è l'unica alternativa.

quando cambio la fila per

for(int i = 0; i < SOMETHING; ++i) 

l'avvertimento scompare. Conosco la differenza tra i++ e ++i ea questo punto della mia vita li ho considerati intercambiabili nella costruzione standard for. Ma Checkstyle considera i++ dannoso (o soggetto a errori).

Domanda: Perché l'incremento del prefisso è migliore dell'incremento postfisso nelle costruzioni for? O ... è sbagliato Checkstyle a riguardo?

+0

Il pre-incremento può essere più efficiente ad es. C++ quando si verificano sovraccarichi dell'operatore su tipi complessi definiti dall'utente. Ma non riesco a capire perché farebbe la differenza con le primitive di Java. –

risposta

11

L'incremento postfix ha senso solo se utilizzato in un'espressione in cui è necessario il vecchio valore prima della modifica. In contesti non validi in cui tale valore viene scartato (come nel ciclo for), il salvataggio del vecchio valore non ha senso.

In altre parole:

// makes sense because you need the old value to subscript the array 
stack[top++] = x; 
// in a void context, the old value is discarded 
top++; 

In C++ in particolare, sia di questi operatori possono essere sovraccaricato, e l'attuazione del suffisso uno può essere inefficiente a causa della necessità per restituire il vecchio valore - solitamente implica la copia del vecchio oggetto per conformarsi alla semantica originale dell'operatore postfisso.

Con i tipi primitivi, qualsiasi compilatore decente produrrà codice identico per entrambi i casi, ma il secondo è migliore dal punto di vista semantico del linguaggio.

12

È una regola stupida, IMHO. La sua descrizione è here

IllegalToken

Controlli per i token illegali.

Rational: alcune funzionalità del linguaggio spesso rendono difficile il mantenimento del codice o non sono ovvie per gli sviluppatori alle prime armi. Altre funzionalità potrebbero essere scoraggiate in determinati framework, ad esempio non avere metodi nativi in componenti EJB.

Per impostazione predefinita, vieta incrementi di postfix, decrementi di postfix e interruttori. Puoi tranquillamente disabilitare la regola o configurarla in modo diverso.

La mia opinione è che la tua regola è un idioma Java standard e che la sostituzione di i ++ con ++ non avrà alcun altro effetto sul fatto che i neofiti si chiedano perché non viene usato l'idioma standard.

Problemi correlati