Лишние телодвижения при проверке булева значения


Исходный код

boolean is_admin;
// something
Boolean b=new Boolean( is_admin );
if( b.toString().length() == 4 ) {
   // something...
}

Что не так в этом коде

В этом коде вместо непосредственной проверки значения переменной произведено два лишних преобразования.

Такие финты ушами наблюдаю более-менее регулярно. Подозреваю, что они происходят от незнания факта, что аргументом оператора if является значение типа boolean, и если у нас есть переменная типа boolean, то мы можем передавать её в оператор if непосредственно.

Чем плохи лишние преобразования? Тут сразу два ответа.

  1. Лишние преобразования расходуют память и процессорное время. Если такое преобразование выполняется однократно, то его влияние можно не учитывать, а если оно находится в цикле на миллион итераций — то лучше так не делать.
  2. Преобразование «зашифровывает» операцию, скрывает её смысл и цель. В результате прочтение кода становится более долгим и напряжённым: сначала надо расшифровать смысл, а потом держать в уме результат расшифровки, что тоже на самом деле требует усилий.

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

Как надо было делать

boolean is_admin;
// something
if( is_admin ) {
   // something...
}

Теория

  • Ребусы в коде