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.
"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. –