2010-12-27 26 views
22

Sé que la palabra clave assert existe en java. Sin embargo, no recuerdo haber visto el código que lo usa. Probablemente estoy usando excepciones y registrando en lugares donde podría haberlo usado. ¿Es una buena práctica usar la palabra clave assert en java?¿Es una buena práctica usar assert en Java?

EDIT: Sé que las afirmaciones en general son una buena práctica. mi pregunta es, para ser más precisos, si en Java el BKM de aserción está usando la palabra clave assert en lugar de usar excepción, registro y otras técnicas.

Respuesta

18

Las aserciones de la razón principal no se utilizan porque no están habilitadas de forma predeterminada.Por lo tanto, si tiene una condición que es lo suficientemente importante como para requerir una aserción, no puede confiar en que las aserciones se habiliten para realizar el trabajo.

Como otras respuestas afirman correctamente, están diseñadas para pruebas y depuración en tiempo de desarrollo porque no cuestan nada si las afirmaciones están deshabilitadas en producción. Creo que es mejor crear pruebas explícitas en el marco de prueba (por ejemplo, una prueba unitaria para las condiciones límite) que confiar en que alguien habilite las afirmaciones durante las pruebas.

Sin embargo, un buen ejemplo que he visto para usar assertions es verificar los argumentos de métodos privados. Como controlas el acceso a esos métodos, puedes verificar que tu propia clase esté usando el método correctamente, mientras que tus métodos públicos usan técnicas de verificación de argumentos más confiables (anotaciones, declaraciones if, bibliotecas de terceros, etc.). De esa manera, incluso si las afirmaciones están deshabilitadas, su método debe estar protegido, pero los desarrolladores que miren el código fuente pueden ver las condiciones previas para su método y activar las afirmaciones para obtener una red de seguridad adicional cuando trabajen en esa clase.

+0

"no habilitado por defecto" un poco confuso. Para la aplicación Java independiente, el colaborador podría activarlo o desactivarlo de forma gratuita. Para los entornos administrados (JEE, servidores), a veces se enciende por defecto: SAP Cloud Platform para la integración por ejemplo utiliza Java afirma con salidas sofisticadas de Groovy. –

1

Bueno, realmente depende de cómo se mire, pero se recomienda.

Por ejemplo, si se escribe un método que calcula la velocidad de una partícula , es posible afirmar que la velocidad calculada es menor que la velocidad de la luz .

0

Sí. Es una forma de validar que se cumplen algunas condiciones "imprescindibles". Tenga en cuenta que debe habilitar explícitamente las aserciones.

De lo contrario, puede usar Validate de commons-lang. Simplemente escriba Validate.notNull(foo) y arroja una excepción si foo es null.

2

Assert no se usa mucho estos días. Puede ser útil en aplicaciones de rendimiento crítico durante el desarrollo para descartar todos los errores y luego simplemente deshabilitar aserciones a través de switches.

Desactivar las aserciones en el tiempo de ejecución es el principal beneficio, ya que, cuando están deshabilitadas, consumen básicamente cero recursos.

Un enfoque más "moderno" es, por ejemplo, utilizar Google Guava con Preconditions. Este es un mecanismo de afirmación de tipo de biblioteca que puede usar cuando se deben cumplir las condiciones y no desea buscar nada con los interruptores de Java.

+0

En cuanto a Guava, los documentos vinculados indican: "Las excepciones de condición previa [...] se utilizan para indicar que el * método de llamada * ha cometido un error. [...] La condición posterior u otras fallas invariables no deberían arrojar estos tipos de excepciones ". cuál IMO no los hace un reemplazo para los asertos() usados ​​para las invariantes sobre el código. – pwes

1

Sí, es una muy buena práctica afirmar sus suposiciones. Lee Design By Contract. assert se puede usar para verificar precondiciones, invariantes y condiciones de publicación durante las fases de integración y prueba. Esto ayuda a detectar los errores en las fases de desarrollo y prueba. Y puede apagarlo de manera segura en producción para evitar problemas de rendimiento.

Las afirmaciones se utilizan normalmente para verificar la corrección de la lógica de su método interno o hacer cumplir el contrato dentro de una clase determinada. Pero use excepciones para hacer que el contrato sea explícito.

1

en mis lecturas de algortihms, mi profesor siempre mantuvo la utilidad de las afirmaciones. se utilizan principalmente para fines de prueba y depuración, lo cual me permite ver el código que lo usa. pero sí, son muy recomendables. Se pueden desactivar si le preocupa el rendimiento. normalmente utilizo System.out.println o puntos de interrupción para probar, pero las aserciones también son de una sola manera. esto es lo que quiero decir:

For example, to prove that sort+reverse is equivalent to sort in reverse order: 
Method 1: sort(int[] arr, int len) 
// pre: len is the length of the array arr 
// post: arr is sorted in ascending order 
Method 2: reverse(int[] arr) 
// post: the order of elements in arr is 
// reversed (e.g. [9 5 10] -> [10 5 9]) 
Assertion 1: the length of arr is len 
sort(arr,len); 
Assertion 2: arr is sorted in ascending order 
reverse(arr); 
Assertion 3: the order of arr is reversed 
0

Es beneficioso para las condiciones breves. Sin embargo, el uso depende de sus prácticas de codificación. Porque, a veces, la lógica se puede aplicar mejor usando "afirmar" y luego usar métodos difíciles.

8

Sí, es raro. La función fue muy solicitada, sin embargo, después de que se introdujo en el lenguaje, prácticamente nadie lo usa.

A veces uso assert como una herramienta para comentar. En lugar de

// now it should be empty 

puedo escribir

assert size == 0; 

Pero realmente no assert encendido, por lo que la afirmación de que nunca fue probado.

Es posible que las personas prefieran probar el código desde afuera, y no sienten la necesidad de plantear muchos asertos en el flujo de código.

7

Usé aserciones mucho más cuando escribí en C++ que en Java. No los uso tanto porque ya no los necesito. Muchos de los errores de C++ que trataría de detectar con aserciones ya no son un problema en Java.

Dicho esto, las afirmaciones son muy valiosas, pero muchas personas no las usan en gran parte porque no las entienden. He escuchado a personas quejarse de que lanzan un error en lugar de una excepción. También escuché esta pregunta: ¿por qué no utiliza una excepción y maneja el caso en lugar de usar una afirmación?

Mi respuesta a ambas es la misma. Se supone que las afirmaciones no atrapan los casos que esperas ver en una aplicación que funcione. El propósito de las aserciones es detectar errores. Solo debe usarlos cuando la única forma de "manejarlos" es retroceder y corregir el código. Es por eso que no lanzan excepciones: no desea que formen parte de su manejo de excepción general.

En cuanto a encenderlos, mi IDE está configurado para activarlos de forma predeterminada. Entonces, para mis pruebas internas, siempre sé que están encendidas.

Aquí hay un ejemplo en el que una afirmación es lo único que se puede usar: trabajé en un gran proyecto de Swing donde los codificadores originales no entendían que la UI solo se puede actualizar desde el hilo del evento, lo que llevó a todo tipo de loco. Así que puse esta afirmación en muchos lugares donde las cosas se comportaban de manera divertida: assert EventQueue.isDispatchThread(); Si se activaba esta afirmación, estábamos ejecutando el hilo equivocado, y los desarrolladores debían ser notificados para poder mover el código al hilo apropiado. No hay forma de solucionar esto en una aplicación que funcione.

1

Estaba muy contento cuando usaba aserciones en mi aplicación Java y sqlite-jdbc devolvía alguna afirmación inteligente para un caso.

Así que si activa las afirmaciones, podrían aparecer en alguna biblioteca de terceros.

0

Las aserciones de la razón principal no se utilizan porque no están habilitadas por defecto. Por lo tanto, si tiene una condición que es lo suficientemente importante como para requerir una aserción, no puede confiar en que las aserciones se habiliten para realizar el trabajo.

Acepto que el gran error de diseño de las aserciones es que están deshabilitadas por defecto.

Por lo tanto pongo

static { AssertionUtil.enableAssertionsForThisClass(); } 

en la parte superior de cada clase. Ver http://commons.unkrig.de.

Cuestiones relacionadas