Почему "условие && statement()" не популярно в мире Java?

Я занимаюсь разработкой Java уже почти десять лет, и я никогда не видел такого выражения, как [2] (см. ниже). Я впервые увидел это в библиотеке JavaScript, где он использовался много.

1.

if(isValid) {
   statement();
}

2.

isValid && statement();

Результаты [1] и [2] идентичны, поскольку statement() не будет оцениваться if isValid == false.

  • Почему синтаксис вроде [2] не популярен? Я имею в виду, я буквально никогда не сталкивался с этим раньше в любом проекте Java, который я видел.
  • Есть ли какие-либо последствия подхода [2]?
  • Считается ли это вредным?
  • Есть ли какие-нибудь сюрпризы, которые я мог бы использовать, используя это как альтернативу для простых операторов if?
  • Уменьшает ли читаемость?

Edit:

Я тестировал это в консоли Groovy. Я предполагаю, что этот вопрос довольно недействителен. Спасибо за ваши ответы в любом случае.

Ответ 1

if( isValid && statement() ) работает только в том случае, если statement() возвращает a boolean, иначе условие не будет компилироваться. Выполнение этого может не считаться хорошим дизайном (в зависимости от того, что действительно делает statement) и может уменьшить читаемость или вашу способность использовать возвращаемое значение statement().

Кроме того, только isValid && statement(); не поддерживается языком - и не делайте ошибку для сравнения языка, такого как Java, с языком, подобным JavaScript, они следуют различным парадигмам.

Вы можете сделать что-то вроде boolean b = isValid && statement();, но обычно вы это делаете, если хотите каким-то образом использовать значение b.

Изменить: В соответствии с запросом KRyan Я также добавлю абзац о значении a && b и о том, что он используется для Java, а также для JavaScript (хотя я не эксперт здесь).

Java

В общем случае вы можете комбинировать два булевых выражения с помощью & (и) или | (или). Таким образом, true & true приведет к true, как и к true | false, но true & false приведет к false и т.д.

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

Теперь, если у вас есть выражение, которое вызывает некоторые методы, которые возвращают логическое значение, вы можете не захотеть выполнять эти методы, если они не нужны, например. когда сами методы довольно дороги. В качестве примера рассмотрим needsCheckWebsite & isValueOnWebsite( "test" ). isValueOnWebsite( "test" ) может занять некоторое время, и если needsCheckWebsite был ложным, вы не захотите выполнить этот метод.

Чтобы исправить это, вы можете использовать двухсимвольные операторы && и ||, а также операторы короткого замыкания. Это означает, что если вы пишете needsCheckWebsite && isValueOnWebsite( "test" ) и если needsCheckWebsite является ложным, дорогостоящее выполнение isValueOnWebsite( "test" ) не произойдет, поскольку мы уже знаем, что результат ничего не меняет.

Следовательно, isValid && statement() означает, что statement() должен выполняться только, если isValid.

JavaScript

AFAIK в JavaScript операторы короткого замыкания работают аналогичным образом, поскольку он вычисляет первый аргумент, и если результат все еще неизвестен, второй аргумент оценивается и возвращается. Однако, поскольку JavaScript является динамически типизированным языком (в отличие от Java, который статически типизирован), вы можете смешивать разные типы, например. var value = null || "hello", что приведет к value = "hello".

Это позволяет разработчику использовать && и || для вещей, отличных от логической логики, таких как предоставление значения по умолчанию, которое невозможно в Java из-за статического ввода (в Java вы можете использовать трехмерный оператор ? для этого, например String s = input != null ? input : defaultValue, но, как вы можете видеть, это выглядит не так элегантно, как JavaScript var s = input || defaultValue).

Ответ 2

Они не взаимозаменяемы:

isValid && statement(); - выражение , а не оператор . Также он будет работать только тогда, когда ваш метод statement() имеет тип boolean.

Таким образом, вы можете использовать его только там, где синтаксис Java-языка ожидается (предикат).

мнение. Если вы будете использовать его при выполнении вышеуказанных требований, я бы действительно нашел, что он "уменьшает читаемость". (поскольку его можно использовать только в определенных ситуациях, плюс ваши собственные слова ( "выполнение Java-разработки уже почти десять лет и я никогда не видел" ), никто этого не ожидает)

Ответ 3

Как поясняется в предыдущем ответе, `isValid && выражение(); является выражением и должно быть сохранено в некоторой переменной, которую мы не можем использовать напрямую, как есть, но для утверждения это не так.

еще одно пространство кучи, занятое использованием выражений.