Есть ли способ отключить оценку короткого замыкания в Java?
Скажем, у меня такой код:
boolean ret = a() && b() && c() && d() && e();
Обычно e() вызывается только в том случае, если все остальные вызовы a() - d() возвращают true. Может быть, какой-то параметр компилятора или JVM отключить оценку короткого замыкания, поэтому e() будет вызываться всегда, независимо от результатов других функций?
В основном я делаю UAT огромной системы и нуждаюсь в проверке e(), однако настройка среды и сценария, который гарантирует, что все a(), b() и т.д. true, крайне болезненны...
EDIT: хорошо, я предполагаю, что бит бит И вместо логического может обеспечить НЕКОТОРЫЙ способ обхода, однако в идеале я ищу решение, которое не требует ЛЮБЫХ ИЗМЕНЕНИЙ в исходном коде. Как по официальной, так и по технической причине (как я упоминал, система большая, и у нас есть целый процесс продвижения и развертывания кода между промежуточными областями и получением выписок). И это только для тестирования, для выпускной версии должна быть включена ленивая оценка (например, использование &)
посмертный:
- "Правильный" ответ: Нет, нет.
- "Полезный" ответ: вы можете изменить && к &
- "Что я сделал в конце" ответ: удалите систему удаленно, положите точку останова на выражение и попросите eclipse запустить e() -_-
Ответы
Ответ 1
Отсутствует опция компилятора или JVM для изменения семантики оценки булевых выражений.
Если вы не можете изменить источник, возможные (хотя и не гарантированные) варианты включают в себя:
- Творчески воссоздайте условия, которые вы пытаетесь протестировать через сложные
настройка предварительных условий.
- Использовать макетные объекты.
- Взломать компилятор.
- Взломайте JVM.
- Twiddle код байта.
Извините, все это намного сложнее, чем опция компилятора /JVM или изменение источника. Кроме того, последние три варианта (а также запрошенная опция компилятора /JVM или изменение источника) нарушают надлежащий протокол тестирования, не изменяя, что тестируется.
Ответ 2
Чтобы отключить короткое замыкание, используйте одиночный '&' или '|' а не два:
boolean ret = a() & b() & c() & d() & e();
Ответ 3
Единственный и совет отличный - объяснить, почему он работает:
boolean ret = a() && b() && c() && d() && e();
Этот вызов использует Logical И на возвращаемые значения из методов. Он знает, что если какой-либо из результатов будет ложным, то конечный результат будет ложным, чтобы он мог немедленно вернуться. "Ленивая оценка" - это стандартная оптимизация вычислений, чтобы избежать ненужной обработки.
boolean ret = a() & b() & c() & d() & e();
Это заменяет логическую операцию арифметическим - побитовым оператором. Если бы это работало над целыми числами, это означало бы and
все отдельные биты целых чисел. В случае логического, хотя есть только истинные или ложные значения, но он по-прежнему оценивается как арифметическое выражение и, следовательно, все части выражения оцениваются.
Итак, для булевых значений и && дают один и тот же логический результат, но они обрабатываются по-разному внутренне, что приводит к поведению, которое вы ищете.