Подтвердить что ты не робот

Есть ли способ отключить оценку короткого замыкания в Java?

Скажем, у меня такой код:

boolean ret = a() && b() && c() && d() && e();

Обычно e() вызывается только в том случае, если все остальные вызовы a() - d() возвращают true. Может быть, какой-то параметр компилятора или JVM отключить оценку короткого замыкания, поэтому e() будет вызываться всегда, независимо от результатов других функций?

В основном я делаю UAT огромной системы и нуждаюсь в проверке e(), однако настройка среды и сценария, который гарантирует, что все a(), b() и т.д. true, крайне болезненны...

EDIT: хорошо, я предполагаю, что бит бит И вместо логического может обеспечить НЕКОТОРЫЙ способ обхода, однако в идеале я ищу решение, которое не требует ЛЮБЫХ ИЗМЕНЕНИЙ в исходном коде. Как по официальной, так и по технической причине (как я упоминал, система большая, и у нас есть целый процесс продвижения и развертывания кода между промежуточными областями и получением выписок). И это только для тестирования, для выпускной версии должна быть включена ленивая оценка (например, использование &)

посмертный:

  • "Правильный" ответ: Нет, нет.
  • "Полезный" ответ: вы можете изменить && к &
  • "Что я сделал в конце" ответ: удалите систему удаленно, положите точку останова на выражение и попросите eclipse запустить e() -_-
4b9b3361

Ответ 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 все отдельные биты целых чисел. В случае логического, хотя есть только истинные или ложные значения, но он по-прежнему оценивается как арифметическое выражение и, следовательно, все части выражения оцениваются.

Итак, для булевых значений и && дают один и тот же логический результат, но они обрабатываются по-разному внутренне, что приводит к поведению, которое вы ищете.