Я думаю, это зависит больше от того, что вы делаете.
Это простой пример, но, как правило, если есть условие, которое я «извлекаю» из другой логики цикла, я вытащу его как можно быстрее с продолжением, а не добавлю к сложности будущего операторы if (ваш первый пример IF, это условие, которое можно извлечь, упрощая будущую логику) Например:
for ( int i = 0 ; i < n ; i++ )
{
if( obj[i] != null && obj[i].instanceOf("A")) {
doSomething();
} else if(obj[i] != null && obj[i].instanceOf("B"){
doSomethingElse();
}
}
СЕЙЧАС ясно, что извлечение первого условия в
if(obj[i] == null) {
continue;
}
может сэкономить некоторую путаницу, поскольку этот цикл улучшается. Я часто использую эту тактику для тестирования параметров метода и либо для раннего возврата, либо для исключения.
Кроме того (это полностью сторонний подход, а не часть ответа вообще!), Я бы сказал, что если вы когда-нибудь увидите «действительно» сбалансированное состояние, вы можете серьезно подумать над дизайном ОО. Если doSomething и someOtherCondition были одинаковыми, они, вероятно, должны быть различными реализациями метода, определенного в базовом классе или интерфейсе, что приводит к следующему коду:
for ( int i = 0 ; i < n ; i++ )
{
obj[i].doSomething();
}