Переписать условный оператор в Java - PullRequest
6 голосов
/ 27 июля 2010

Скажем, если у меня есть код ниже, он определяет, что какое-то условие соответствует, а затем присваивает логическое значение и запускает несколько кодов.Затем выведите исключение, если значение booleanValue равно false.Что если я хочу, чтобы он немедленно выдал исключение, если значение booleanValue равно false, не запуская остальные коды?Если я просто помещу второе условное утверждение в первое, то будут дублированные коды.Пожалуйста, покажите мне умный способ сделать это (я изменил код, чтобы он выглядел как мои настоящие коды).

boolean booleanValue = false;
Permission value;

if (someCondition) {
   value = getPermission_1();
   booleanValue = someMethod(value);
   useValue_1(value);
}
else {
   value = getPermission_2();
   booleanValue = anotherMethod(value);

   useValue_2(value);
}

if (!booleanValue) {
   throw Exception();
}

Ответы [ 7 ]

7 голосов
/ 27 июля 2010

Как насчет исключения логической переменной?Вы можете переписать свой код следующим образом:

if (someCondition) {
   if (!someMethod()) {
     throw new Exception();
   }
   some codes...
}
else {
   if (!anotherMethod()) {
     throw new Exception();
   }
   some codes...
}

Это выглядит проще для меня, но такие вещи - дело вкуса ...

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

4 голосов
/ 27 июля 2010

Вместо

 booleanValue = anotherMethod();

вы просто напишите

if( !someMethod() )
   throw new SomeException();

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

2 голосов
/ 27 июля 2010

Предполагая, что два some codes... различны, вы, вероятно, захотите сделать:

boolean booleanValue = someCondition ? someMethod() : anotherMethod();
if(!booleanValue) {
    throw new Exception();
}

if(someCondition) {
    // some code
} else {
    // some code
}

Если они одинаковые, if(someCondition) не требуется


Если (гипотетически) у вас есть инструмент статического анализа, который не допускает троичных выражений, вы можете заменить первые строки на:

boolean booleanValue;
if(someCondition) {
    booleanValue = someMethod();
} else {
    booleanValue = anotherMethod();
}
1 голос
/ 27 июля 2010

Ваше лучшее решение будет ...

if (someCondition) {
   value = getPermission_1();

   if (!someMethod(value)) {
     throw new SomeException();
   }

   useValue_1(value);
}
else {
   value = getPermission_2();

   if (!anotherMethod(value)) {
     throw new AnotherException();
   }

   useValue_2(value);
}

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

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

1 голос
/ 27 июля 2010

Это все очень субъективно, возможно?

boolean booleanValue = aBoolean;
if (someCondition) {
   if (!someMethod()) {
       throw new SomeException();
   }
   some codes...
} else {
   if (!anotherMethod()) {
     throw new AnotherException();
   }
   some other codes...
}
1 голос
/ 27 июля 2010

Очевидное решение:

boolean booleanValue = false;

if (someCondition) {
   booleanValue = someMethod();
   if(booleanValue){
       //some codes...
   }
}
else {
   booleanValue = anotherMethod();
   some codes...
}

if (!booleanValue) {
   throw Exception();
}

... но я не против повторить бит if(!booleanValue) throw Exception();, потому что это, вероятно, концептуально другая причина, по которой вы выкидываете исключение. (Вы могли бы предоставить лучшую ошибку msg в вашем исключении, например.)

0 голосов
/ 27 июля 2010

Это вроде пахнет ... как в "кодовом запахе". Возвращаемое значение переводится в исключение. Похоже, что если вызывающий объект написал someMethod и anotherMethod, то решение состоит в том, чтобы переписать эти методы и вызвать исключение из этих методов вместо использования возвращаемого значения. Но это только если у программиста есть доступ к коду. Если это сторонний вызов API, я полагаю, что перевод может произойти.

...