uso how java assert

how - ¿Es una buena práctica usar Assert en Java?



how to use assert java (11)

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 e iniciando sesión en lugares donde podría haberlo usado. ¿Es una buena práctica usar la palabra clave assert en java?

EDIT : Sé que las afirmaciones en general es 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 lugar de usar la excepción, el registro y otras técnicas.


La razón principal por la que no se utilizan las aserciones es 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 estén habilitadas para realizar el trabajo.

Estoy de acuerdo en que el gran error de diseño de las afirmaciones es que están deshabilitadas por defecto.

Por eso puse

static { AssertionUtil.enableAssertionsForThisClass(); }

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


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

Deshabilitar aserciones en tiempo de ejecución es el beneficio principal, ya que, cuando se deshabilitan, utilizan básicamente cero recursos.

Un enfoque más "moderno" es, por ejemplo, utilizar Google Guava con condiciones Preconditions . Este es un mecanismo de aserción de tipo de biblioteca que puede utilizar cuando se deben cumplir las condiciones y no quiere buscar a tientas los interruptores java.


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

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


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


La razón principal por la que no se utilizan las aserciones es 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 estén habilitadas para realizar el trabajo.

Como otras respuestas han indicado correctamente, están diseñadas para pruebas de tiempo de desarrollo y depuración porque no cuestan nada si las aserciones están deshabilitadas en la producción. Creo que es mejor crear pruebas explícitas en su marco de prueba (por ejemplo, una prueba de unidad para condiciones de borde) que confiar en que alguien habilite aserciones durante la prueba.

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


Me sentí muy satisfecho cuando usé aserciones en mi aplicación java y sqlite-jdbc devolvió alguna aserción inteligente para un caso.

Entonces, si activa las aserciones, podrían aparecer en alguna biblioteca de terceros.


Sí, es una muy buena práctica afirmar sus suposiciones. Leer Diseño por Contrato . assert se puede utilizar para verificar condiciones previas, invariantes y condiciones posteriores durante las fases de integración y prueba. Esto ayuda a detectar los errores durante las fases de desarrollo y prueba. Y puede desactivarlo de forma segura en la producción para evitar problemas de rendimiento.

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


Sí. Es una forma de validar que se cumplan algunas condiciones "obligatorias". Tenga en cuenta que tiene que habilitar explícitamente las aserciones.

De lo contrario, puede utilizar Validate desde commons-lang. Solo escribe Validate.notNull(foo) y arroja una excepción si foo es null .


Si es raro La característica fue muy solicitada, pero después de que se introdujo en el lenguaje, prácticamente nadie la usa.

A veces uso asert como una herramienta de comentarios. En lugar de

// now it should be empty

Puedo escribir

assert size == 0;

Pero realmente no assert la afirmación, por lo que la afirmación nunca se probó.

Es posible que las personas prefieran probar el código desde el exterior y no sientan la necesidad de plantar muchas afirmaciones en el flujo del código.


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

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

Mi respuesta a ambos es la misma. No se supone que las aserciones detecten los casos que espera ver en una aplicación que funcione. El propósito de las aserciones es atrapar errores. Solo debe usarlos donde la única forma de "manejarlos" es regresar y corregir el código. Es por eso que no lanzan excepciones: no desea que formen parte de su manejo general de excepciones.

En cuanto a encenderlos, mi IDE está configurado para encenderlos por defecto. 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 debe usar: trabajé en un gran proyecto Swing en el que los codificadores originales no entendían que la interfaz de usuario solo se puede actualizar desde el hilo del evento, lo que llevó a todo tipo de errores. Así que puse esta afirmación en muchos lugares donde las cosas se estaban comportando de forma divertida: afirmar EventQueue.isDispatchThread (); Si esta afirmación se activó, estábamos ejecutando desde el subproceso incorrecto, y los desarrolladores necesitaban ser notificados para poder mover el código al subproceso adecuado. No hay manera buena de manejar esto en una aplicación que funcione.


en mis conferencias de algortihms, mi profesor siempre mantuvo la utilidad de las afirmaciones. Se utilizan principalmente para fines de prueba y depuración, por lo que veo el código que lo usa. Pero sí, son muy recomendables. Se pueden desactivar si está preocupado por el rendimiento. Normalmente utilizo System.out.println o puntos de interrupción para probar, pero las aserciones también son una forma. 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