Pergunta

Eu gostaria de ter algum tipo de mecanismo rápido de falha em todo o projeto (talvez um RuntimeException) para qualquer código que cause a atribuição de NaN.

No meu projeto NaN nunca é um valor válido.

Eu percebo que poderia adicionar afirmações (usando isnan) ou outros testes, mas quero saber se há uma maneira mais elegante.

Foi útil?

Solução

Sim, você pode usar as aspectos (programação orientada para aspectos) para lançar um erro sempre que um valor é definido como NAN.

Essencialmente, você deseja interceptar sempre que um valor estiver definido e executar alguma outra função.

Fizemos coisas semelhantes em nossa base de código ... mas não posso lhe dar muita ajuda fora disso.

Outras dicas

Não, porque NaN É um valor válido, usá -lo não fará com que nenhuma exceção seja jogada. Sem mecanismos de monitoramento onipresentes a serem usados, você teria que testar explicitamente os pontos em que ele pode ser atribuído ou devolvido de um método.

Se você estiver pronto para sacrificar o desempenho do aplicativo, poderá criar um invólucro para o dobro (ou outro objeto numérico que deseja usar) e lançar exceção quando NaN está definido.

Tecnicamente, seria possível criar um agente para fazer isso por instrumentação o código em questão para injetar afirmar ou E se testes automaticamente. Isso envolveria um pouco de inspeção e transformação de bytecode (por exemplo, usando ASM). Na minha opinião, seria preciso circunstâncias extraordinárias para justificar isso. Você teria que ter cuidado para não instrumentar nenhuma aula que dependesse de poder processar Nan internamente.

Não sei que alguém escreveu um agente assim. Se você está procurando uma bala de prata, acho que não existe.

Apenas mais uma abordagem - você pode integrar verificadores de código como PMD em seu processo de construção e criar uma regra que relata todas as atribuições de Double.NaN.

Não será perfeito, porque não pode pegar as nan que você recebe de fora (banco de dados, conexões) ou que alguém cria através da manipulação de bits, mas pelo menos você pode garantir que Double.NaN não pode ser atribuído a uma variável ou ser usado como um parâmetro de método ou dentro de uma avaliação.

Definir as regras pode ser desafiador - mas pelo menos - é outra abordagem. A regra mais simples pode ser proibir Double.NaN de forma alguma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top