2010-09-27 25 views

risposta

54

L'avviso genera un errore di runtime (AssertionError) se la sua condizione è falsa. Gli avvertimenti offrono un modo semplificato di documentare, verificare e applicare i criteri di correttezza del codice. I vantaggi sono un aggancio a livello linguistico per definire e manipolare queste condizioni di correttezza. Nella misura in cui desideri abilitarli o disabilitarli (ci sono argomenti riguardo al fatto che questa sia o meno una buona idea) puoi farlo dalla riga di comando di JVM. Alcuni commentatori sottostanti notano che le asserzioni sono disabilitate di default a meno che non si esegua in modalità debug; la mia pratica è di aggiungere "-ea" (abilita asserzioni) nei miei script di wrapper in ogni momento. Anche nel codice sensibile alle prestazioni, per me il tradeoff pesa a favore della sicurezza/correttezza che ottengo dalle asserzioni. Assertions at Oracle e API Description for AssertionError

nota la distinzione tra i guasti attesi o inattesi (eccezioni), che può essere fuori del vostro controllo, e errori di asserzione - errori di asserzione ipotesi programmatore documento e indicare un programma di corretta piuttosto che una condizione esterna imprevisto o prevedibile condizione eccezionale. Se si verifica un errore di asserzione, l'interpretazione è che il programmatore ha frainteso o espresso in modo errato il programma, piuttosto che altre fonti di errore o errore.

In pratica, lo uso per documentare ipotesi ovvie o non ovvie che faccio e invarianti che voglio applicare mentre produco codice (in particolare privato/interno), chiarendo a me stesso e agli altri perché queste ipotesi sono fatte , dove sono fatti e se sono convalidati o meno. Molto meglio dei commenti allo stesso effetto. Questo è un (piccolo) passo verso Design by Contract.

L'articolo Java 38 valido "Verifica i parametri di validità" (Google Books, Amazon.com) fornisce un'utile presentazione della distinzione tra il controllo dei parametri e l'uso appropriato delle asserzioni.

correlati su SO: (Enabling assertions in netbeans), (Assertions vs. Exceptions), (Near duplicate, asking for examples), (Badly named, but very similar content)

+10

Vorrei aggiungere che le asserzioni sono disabilitate di default in fase di esecuzione. Sono disponibili opzioni della riga di comando (-enableassertions o -ea) per abilitare selettivamente asserzioni. –

+2

Penso che tu intenda "disabilitato nel codice di non-debug" piuttosto che "disabilitato in fase di runtime". – DJClayworth

+0

Usando Netbeans, come posso inserire -ea? – Pete

3

andersoj è corretto. Solo per farvi sapere, la cosa grandiosa dell'asserzione è che potete semplicemente disattivarlo (se non passate -ea nella riga di comando di java). Questa semplice cosa li rende perfetti per l'uso in fase di sviluppo, quando vuoi essere sicuro di non infrangere il tuo codice.  

-2

puoi usarlo per abilitare qualcosa durante dev, quindi disabilitarlo completamente sul sito live. ad esempio

... 
assert debug("xxx"); 
... 

static boolean debug(String format, Object... args){ print(...); return true; } 

l'istruzione di debug aggiungerà zero overhead sul sito live.

+6

Pensi che sia una buona pratica? Penso che sia meglio usare alcuni metodi Logger.debug() o qualcosa del genere. –

+0

Penso che la best practice comunemente accettata sia quella di allontanarsi da questo genere di cose, evitando chiamate al metodo potenzialmente complesse. Soprattutto se c'è qualche possibilità di effetti collaterali (e conterrei l'output sullo stdout come un "effetto collaterale"). – andersoj

0

per la precisione sulla vostra domanda:

Assert viene utilizzato per convalidare la condizione di un comunicato.

assert (some condition) 
Example : assert (6 < 7) // condition pass 
      assert (6 > 7) // throws AssertionException here 

La maggior parte delle persone utilizzano valere per il seguente caso d'uso per String: (Ma io personalmente odio usare valere per esso):

assert (obj != null || obj.isEmpty() || ...) 

ho un po 'come con google guava che è pulito e servire il scopo:

Obj.isNullOrEmpty() 

Maggiori informazioni: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html

3

Quali vantaggi ti offre o perché pensi che non valga la pena di usarlo?

Uso afferma per controlli obbligatori, come altri hanno raccomandato è una pratica pericolosa.

Cosa succede quando un altro sviluppatore utilizza la libreria? Oppure un amministratore di sistema o un utente esperto si dimentica, o, peggio, non sa, di abilitare le affermazioni con il flag -ea in fase di runtime? Perdi tutti questi controlli, ecco cosa.

Gli avvisi sono uno strumento di sviluppo. Il fatto che lo stato predefinito del flag sia off è un dato negativo.

Nessuna funzione o vantaggio nella propria applicazione deve mai dipendere dal fatto che una funzione sia attiva.

Come sfondo, le affermazioni vengono utilizzate allo stesso modo in C/C++ da cui è stata presa la funzione. In C/C++ uno sviluppatore di solito può passare in un #define DEBUG ... in fase di compilazione per abilitare o disabilitare le asserzioni. Con codice di produzione C/C++ che di solito ha questa funzione disattivata.

Concettualmente, lo stesso dovrebbe valere per Java. In produzione, utilizzare condizioni condizionali ed eccezioni. Sono essenzialmente la stessa cosa.