Я хотел бы иметь некоторый сбой всего проекта быстрый механизм (возможно, a RuntimeException
) для любого кода, который вызывает присвоение NaN
.
В моем проекте NaN
никогда не допустимое значение.
Я понимаю, что мог добавить, утверждает (использующий isNaN) или другие тесты повсюду, но я хочу знать, существует ли более изящный путь.
Да, вы можете использовать AspectJ (аспектно-ориентированное программирование) для выдачи ошибки всякий раз, когда установлено значение NaN.
По сути, вы хотите перехватывать всякий раз, когда установлено значение, и выполнять некоторую другую функцию.
Мы делали похожие вещи в нашей кодовой базе ... но я не могу оказать вам особой помощи, кроме этого.
Нет - потому что NaN
является действительным значением, использование которого не вызовет никаких исключений. Без вездесущих механизмов мониторинга, которые можно было бы использовать, вам пришлось бы явно тестировать в точках, где оно может быть назначено или возвращено из метода.
Технически, можно было бы создать агента для этого методом Инструментаринг Код, имеющий вопрос для введения Assert или , если тесты автоматически. Это будет включать немного осмотра и преобразования байттекода (например, использование ASM ). На мой взгляд, это потребовало бы необычных обстоятельств, чтобы гарантировать это. Вы должны быть осторожны, чтобы не инструментировать какие-либо классы, которые полагаются на возможность обрабатывать NAN внутри.
Я не знаю, что кто-то написал такой агент. Если вы ищете серебряную пулю, я не думаю, что есть один.
Просто другой подход - вы можете интегрировать в процесс сборки такие устройства проверки кода, как PMD и создать правило, сообщающее о каждом назначении Double.NaN
.
Это будет не идеально, потому что не может поймать NaN, который вы получаете извне (база данных, соединения) или который кто-то создает с помощью манипуляций с битами, но, по крайней мере, вы можете быть уверены, что Double.NaN
не может быть присвоен переменной или использован в качестве параметра метода или внутри вычисления.
Определение правил может быть сложным - но, по крайней мере, это другой подход. Самым простым правилом могло бы быть запрещение Double.NaN
вообще.
Если вы готовы пожертвовать производительностью приложения, вы можете создать обертку для двойного (или другого численного объекта, который вы хотите использовать) и бросать исключение, когда NAN
набор.