2009-09-15 2 views
-3

В Java: Какой код наиболее эффективен и почему?Лучшие практики ElseIf против исключения броска

if (x==1) { 
    .... 
} else if (x==2) { 
    .... 
} else if (x==3) { 
    .... 
} else if (x==4) { 
    .... 
} 
... rest code here... 

or 

try { 
    if (x==1) { 
     ... 
     throw MyException(1); 
    } 
    if (x==2) { 
     ... 
     throw MyException(2); 
    } 
    if (x==3) { 
     ... 
     throw MyException(3); 
    } 
    if (x==4) { 
     ... 
     throw MyException(4); 
    } 
} catch(MyException MEx) { 
    ... rest code here ... 
} 

Большое спасибо!

+5

Вы должны использовать переключатель, который вы знаете –

+0

Возможно, использовать переключатель - но помните, что переключатели (и блоки кода, такие как вопрос ifs) являются плохим запахом кода. В этом случае то, что он, вероятно, хочет, - это поиск таблицы в структуре данных, но может потребоваться больше .. будет зависеть от того, что находится внутри {....}, но вы практически никогда не хотите видеть, блокируют ли они блоки else в списке. –

+0

Может быть, это только я, но это кажется мне очень странным, когда стандартная функция любого языка в качестве переключателя помечена как «плохой запах кода». –

ответ

13

В вашем примере вы используете исключения для управления потоком. Исключения составляют дорогостоящие операции (или, по крайней мере, значительно дороже, чем if и else-if блоков). Исключения должны использоваться только в исключительных ситуациях.

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

+0

+1 для комментариев, что два блока фактически делают разные вещи. –

+0

Усилить, если с броском у меня нет, чтобы выполнять другие случаи, в любом случае ... теперь для меня ясно, что исключения дороже, чем если бы они были. Спасибо большое, Томас! – Mblua

0

В настоящий момент они не сопоставимы. Зачем ставить «остальную часть кода» во втором примере в обработчике исключений, когда это исключение не упоминается в первом примере? Если это исключение наверняка будет выбрано, тогда «остальная часть кода» в первом никогда не будет выполнена.

0

Вы получаете больше производительности, если не с использованием исключений. Но исключения представляют собой особый вид структуры и не следует путать с структурами потока управления, такими как if-else.

2

Не только вторая версия имеет худшую производительность, но и смущает читателя, а не то, как используются исключения.

4

Другие ответили на ваш вопрос, но я думал, что указывают ...

Просто потому, что Java не имеет команду «GOTO» (реализовано), не означает, что вы должны использовать Исключения имитировать их.

0

Не то, чтобы я был большим поклонником операторов switch, но разве это не похоже на ситуацию с учебниками, чтобы использовать их?

switch (x) { 
    case 1: 

     break; 
    case 2: 

     break; 
    default: 
     break; 
    } 
... 
+0

Всё зависит от меня. В этом конкретном примере, поскольку все сравнивается с использованием ==, коммутатор будет работать. Однако, если вы хотите потенциально выполнить несколько блоков, используя ==, <, >, <=, and > =, тогда if/else-if будет лучше. –

+0

Ник, вы перепутали свой оператор switch, вам нужен только один переключатель (x) и добавьте значение по умолчанию: – DanM

+0

Спасибо, Dan, пытаясь быть быстрым, это не всегда хорошая идея ;-) – NickDK

0

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

Условный/ElseIf построить.

и почему?

Поскольку позже предполагает создание объекта типа MyException (который внутри может заполнить StackTrace, выделения памяти для объекта, присвоить переменную с кодом исключения)

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

Я мог бы дать вам (или попытаться) объяснение по этому поводу, но лучше для вас, чтобы прочитать его от власти по этому вопросу:

Эффективное Java пункт: Use exception for exceptional conditions.

Joshua Блох.

Смежные вопросы