Perché le asserzioni in Java devono essere abilitate?

2

Mi piace molto il concetto di asserzioni in Java nel modo in cui usarle. È molto più facile che scrivere un if e quindi lanciare un'eccezione / errore.

Ma la cosa che non capisco è, perché hanno bisogno di essere abilitati con -ea a lavorare? Questo li rende inaffidabili e questo è il motivo per cui non li uso. Qual è lo scopo di questa decisione e qual è lo scopo delle asserzioni se possono essere attivate o disattivate e il programma deve gestirle?

    
posta piegames 06.06.2016 - 09:26
fonte

3 risposte

4

Penso che sia stata una scelta di progettazione linguistica.

Alcune asserzioni possono richiedere molto tempo, specialmente se confrontano l'output di alcune funzioni. Abilitare le asserzioni è come un flag di "debug". Se quella scelta sia ragionevole, è una questione completamente diversa.

Il modo in cui I di solito è il codice è che per metodi esterni / pubblici, gli argomenti vengono controllati e vengono lanciati IllegalArgumentsExceptions. E per i metodi interni / privati, vengono utilizzate asserzioni sugli argomenti / risultati o nel codice. È più conciso e non ci sono impatti sulle prestazioni quando il codice viene rilasciato.

    
risposta data 06.06.2016 - 11:02
fonte
8

Le asserzioni non sono intese a sostituire i parametri del metodo di controllo o lo stato del programma e a lanciare eccezioni informative di fronte a una situazione eccezionale. La logica del tuo programma o la tua logica di gestione degli errori non dovrebbero fare affidamento su di essi.

Lo scopo di un'asserzione è di forzare un programma a fallire quando una semplice autodiagnostica mostra che c'è qualcosa di sbagliato nel programma stesso. Le asserzioni possono aiutare un programmatore a trovare bug ed evitarli, in primo luogo. Poiché tutte le attività di programmazione e debug devono essere eseguite in un ambiente di sviluppo piuttosto che in un ambiente di produzione, le asserzioni sono solitamente disabilitate negli ambienti di produzione.

In generale, dovresti usare solo gli asserti per aiutarti a trovare gli errori nel metodo o nella classe a cui appartiene l'asserzione. Non dovresti usare le asserzioni per informare qualche modulo del cliente su una condizione eccezionale.

    
risposta data 06.06.2016 - 10:52
fonte
1

Java potrebbe aver appena copiato questa pratica da C / C ++, dove le asserzioni sono disabilitate in una build ottimizzata, come pratica comune.

Il motivo per cui è in questo modo in C / C ++ è che assert crea un ramo aggiuntivo nel codice, che di solito non è quello che desideri nella versione di rilascio.

Il motivo per cui potrebbe non essere così importante in Java è che JIT probabilmente renderà il risultato negativo asimmetrico come compensazione del risultato.

La ragione per cui potrebbe ancora importare in Java è che certe ottimizzazioni potrebbero non essere possibili quando un nodo nel diagramma di flusso del programma può essere lanciato. Quindi il codice con le affermazioni cancellate potrebbe essere migliore nonostante l'aspetto JIT.

    
risposta data 06.06.2016 - 11:31
fonte

Leggi altre domande sui tag