Перезапись условного оператора в Java

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

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();
}
6
задан newguy 27 July 2010 в 02:14
поделиться

7 ответов

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

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

На мой взгляд, это проще, но такие вещи - дело вкуса ...

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

7
ответ дан 8 December 2019 в 14:39
поделиться

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

boolean booleanValue = false;

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

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

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

1
ответ дан 8 December 2019 в 14:39
поделиться

Вместо

 booleanValue = anotherMethod();

вы должны просто написать

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

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

4
ответ дан 8 December 2019 в 14:39
поделиться

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

boolean booleanValue = aBoolean;
if (someCondition) {
   if (!someMethod()) {
       throw new SomeException();
   }
   some codes...
} else {
   if (!anotherMethod()) {
     throw new AnotherException();
   }
   some other codes...
}
1
ответ дан 8 December 2019 в 14:39
поделиться

Лучшим решением будет ...

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
ответ дан 8 December 2019 в 14:39
поделиться

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

0
ответ дан 8 December 2019 в 14:39
поделиться

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

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();
}
2
ответ дан 8 December 2019 в 14:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: