Pregunta

Me gustaría tener algún tipo de proyecto de alcance fallar mecanismo rápido (tal vez un RuntimeException) para cualquier código que hace que la asignación de NaN.

En mi proyecto NaN no es un valor válido.

Me doy cuenta de que podría añadir asevera (usando isNaN ) u otras pruebas a lo largo, pero me gustaría saber si hay una manera más elegante.

¿Fue útil?

Solución

Sí, puede utilizar AspectJ (programación orientada a aspectos) para lanzar un error cuando un valor se establece en NaN.

En esencia, que desea interceptar cuando se establece un valor, y realizar alguna otra función.

Hemos hecho cosas similares en nuestra base de código ... pero no le puede dar mucha ayuda fuera de eso.

Otros consejos

No - porque NaN es un valor válido, usando lo que no causa ninguna excepción sea lanzada. Sin ningún tipo de mecanismos de vigilancia ubicuos a su uso, se tendría que probar de forma explícita en los puntos donde puedan serle asignados o volver de un método.

Si usted dispuesto a sacrificar el rendimiento de la aplicación, se puede crear un contenedor de doble (o cualquier otro objeto numérico que desea utilizar) y lanzar una excepción cuando es NaN conjunto.

Técnicamente, sería posible crear un agente para hacer esto instrumentar el código en cuestión para inyectar aserción o si pruebas de forma automática. Esto implicaría un poco de inspección de código de bytes y la transformación (por ejemplo, utilizando ASM ). En mi opinión, se necesitarían circunstancias extraordinarias para justificar esto. Habría que ser cuidadosos al instrumento de las clases que se basan en ser capaz de procesar NaN internamente.

No estoy al tanto de que alguien ha escrito un agente de este tipo. Si lo que buscas es una bala de plata, no creo que hay uno.

Sólo otro enfoque - que podría integrar las damas de código como PMD en su proceso de construcción y crear una regla que informes cada asignación de Double.NaN.

No será perfecto, porque no puede coger NaN es que se obtiene de la parte exterior (base de datos, conexiones) o que alguien crea a través de la manipulación de bits, pero al menos se puede asegurar que Double.NaN no se puede asignar a una variable o ser utilizado como un parámetro de método o dentro de una evaluación.

La definición de las normas podrían ser un reto - pero al menos - es otro enfoque. La regla más simple podría ser prohibir Double.NaN en absoluto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top