Si utilizza questa parola chiave o si genera qualche eccezione di runtime di convalida? Quali benefici ti dà o perché pensi che non valga la pena di usarlo?Assertare la parola chiave in java
risposta
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)
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.
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.
Pensi che sia una buona pratica? Penso che sia meglio usare alcuni metodi Logger.debug() o qualcosa del genere. –
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
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
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.
- 1. Java: quando utilizzare la parola chiave "this"
- 2. Come la Parola Chiave opere eccellenti in java-Java Puzzle
- 3. Ruolo della nuova parola chiave in Java
- 4. Confuso circa la parola chiave "super" in questo esempio Java
- 5. Parola chiave "nuova" in Scala
- 6. L'utilizzo di questa parola chiave Java
- 7. parola chiave virtuale in C#
- 8. null è una parola chiave Java?
- 9. Manca la parola chiave 'with' in C#
- 10. Quando passare la parola chiave ref in
- 11. cos'è la parola chiave "as" in swift
- 12. La parola chiave 'descrivere' in javascript
- 13. La parola chiave finale è necessaria nella classe Singleton Java?
- 14. evidenzia la parola nella stringa, se contiene la parola chiave
- 15. Unittest: assertare codice SystemExit
- 16. Parola chiave "nice" in C++?
- 17. nidificati sincronizzato parola chiave
- 18. La parola chiave "overload" fa la differenza?
- 19. Esempio completo per l'utilizzo della parola chiave volatile in java?
- 20. Perché usiamo la parola chiave volatile in C++?
- 21. Parola chiave astratta in PHP
- 22. EXCEPT parola chiave in Oracle
- 23. Registrati parola chiave in C++
- 24. UTILIZZO parola chiave in MySQL
- 25. parola chiave predefinita in php
- 26. "come" parola chiave in OCaml
- 27. incapace di comprendere nuova parola chiave in java
- 28. Il getta parola chiave per le eccezioni in Java
- 29. Creazione oggetto utilizzando parola chiave static in Java
- 30. parola chiave memorizzati in Delphi
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. –
Penso che tu intenda "disabilitato nel codice di non-debug" piuttosto che "disabilitato in fase di runtime". – DJClayworth
Usando Netbeans, come posso inserire -ea? – Pete