2010-09-27 17 views
33

¿Utiliza esta palabra clave o emite alguna excepción de tiempo de ejecución de validación? ¿Qué beneficios le proporciona o por qué cree que no vale la pena usar?Assert keyword in java

Respuesta

54

Assert lanzará un error de tiempo de ejecución (AssertionError) si su condición es falsa. Las afirmaciones le brindan una forma simplificada de documentar, verificar y aplicar los criterios de corrección para su código. Los beneficios son un gancho a nivel de lenguaje para definir y manipular estas condiciones de corrección. En la medida en que desee habilitarlos o deshabilitarlos (existen argumentos sobre si esta es una buena idea o no), puede hacerlo desde la línea de comandos de JVM. Algunos comentaristas a continuación indican que las aserciones están deshabilitadas por defecto a menos que se ejecute en modo de depuración; mi práctica es agregar "-ea" (habilitar afirmaciones) en mis scripts de contenedor en todo momento. Incluso en el código sensible al rendimiento, para mí el intercambio pesa a favor de la seguridad/seguridad que obtengo de las aserciones. Assertions at Oracle y API Description for AssertionError

nota la distinción entre fallos esperados o inesperados (excepciones), los cuales pueden estar fuera de su control, y errores de aserción - supuestos errores de aserción documento programador, e indicar un programa incorrecto en lugar de una condición externa inesperada o esperado condición excepcional. Si se produce una falla de aserción, la interpretación es que el programador ha malentendido o expresado incorrectamente el programa, en lugar de otras fuentes de error o error.

En la práctica, lo uso para documentar suposiciones obvias o no obvias que hago e invariantes que deseo aplicar cuando produzco código (particularmente privado/interno), dejando en claro a mí mismo y a los demás por qué se hacen estas suposiciones , donde están hechos, y si están validados o no. Mucho mejor que los comentarios con el mismo efecto. Este es un (pequeño) paso hacia Design by Contract.

El elemento Java # 38 "Comprobar parámetros de validez" (Google Books, Amazon.com) proporciona una presentación útil de la distinción entre la comprobación de parámetros y el uso apropiado de las aserciones.

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

+10

Me gustaría agregar que las aserciones están deshabilitadas por defecto en el tiempo de ejecución. Hay conmutadores de línea de comandos (-enableassertions, o -ea) disponibles para activar selectivamente las afirmaciones. –

+2

Creo que quiere decir "deshabilitado en código sin depuración" en lugar de "deshabilitado en tiempo de ejecución". – DJClayworth

+0

Usando Netbeans, ¿cómo me quedo en -ea? – Pete

3

andersoj es correcta. Solo para que lo sepas, lo mejor de las afirmaciones es que puedes apagarlo (si no pasas -ea en la línea de comandos de java). Esta simple cosa los hace perfectos para usar en el desarrollo, cuando quiere asegurarse de que no está rompiendo su propio código.  

-2

puede usarlo para habilitar algo durante el desarrollo, luego deshabilitarlo completamente en el sitio en vivo. por ejemplo

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

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

la instrucción de depuración agregará cero sobrecarga en el sitio en vivo.

+6

¿Crees que es una buena práctica? Creo que es mejor utilizar algunos métodos Logger.bug() o algo así. –

+0

Creo que la mejor práctica comúnmente aceptada es alejarse de este tipo de cosas, evitando llamadas a métodos potencialmente complejos. Especialmente si hay algún potencial de efectos secundarios (y contaría la salida a stdout como un "efecto secundario"). – andersoj

0

Para ser más precisos en su pregunta:

Assert se utiliza para validar la condición de un comunicado.

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

La mayoría de la gente usa valer para el siguiente caso de uso para la secuencia: (Pero, personalmente, odio usar valer para ello):

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

me gusta más el uso de Google de guayaba que está limpio y servir a la objetivo:

Obj.isNullOrEmpty() 

Más información: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html

3

¿Qué beneficios le proporciona o por qué cree que no vale la pena usar?

Usando afirma para los controles obligatorios, como otros han recomendado es una práctica peligrosa .

¿Qué sucede cuando otro desarrollador usa su biblioteca? ¿O un administrador del sistema o un usuario avanzado olvida, o lo que es peor aún, saber, para habilitar las afirmaciones con el indicador -ea en tiempo de ejecución? Pierdes todos estos controles, eso es qué.

Asserts son una herramienta de desarrollo. El hecho de que el estado predeterminado de la bandera sea en es un obsequio irrecuperable.

Ninguna función o beneficio en su aplicación debe depender de que se active una afirmación.

Como fondo, las afirmaciones se utilizan de la misma manera en C/C++ donde se tomó la característica. En C/C++ un desarrollador generalmente puede pasar un #define DEBUG ... en tiempo de compilación para habilitar o deshabilitar las afirmaciones. Con el código de producción C/C++ generalmente tiene esta función desactivada.

Conceptualmente, lo mismo debería ser cierto para Java. En producción, uso condicionales y Excepciones. Ellos son esencialmente lo mismo.