Есть несколько вещей, которые вы можете сделать здесь. В конечном счете, то, что вы делаете, должно зависеть от вашего стиля кодирования и того, что вы пытаетесь достичь.
Вариант 1 будет иметь некоторые вариации:
for (;;)
{
int number = /* ... */;
myMethod(number);
if (number == -10)
break;
}
Вы можете сказать, довольно субъективно и в зависимости от обстоятельств, что это плохо, потому что знание условия завершения содержится в цикле, а не в методе, выполняющем «реальную работу». Может быть, для вашего цикла это нормально. Может быть, в других обстоятельствах (или, возможно, с другими программистами? Это очень зависит от вкуса.) Вы можете принять myMethod
, чтобы принять это решение. В общем, мой личный вкус обычно сводится к тому, что знание сценариев не должно распределяться по различным источникам, а в одном месте.
Таким образом, большая часть того, что я напишу здесь, будет о том, как заставить myMethod
принять решение о том, прекратить или нет.
Вариант 2 - myMethod
возвращает логическое значение, указывающее, что мы должны завершить:
for (;;)
{
int number = /* ... */;
if (myMethod(number))
break;
}
boolean myMethod(int number)
{
// TODO - do stuff
return number == -10;
}
Но вы можете сказать, что myMethod
уже хочет вернуть какой-то другой тип. Я родом из языка Си, поэтому идиома, к которой я больше всего привык, - это «параметр out». Приводит меня к варианту 3:
Опция 3 - параметр Out позволяет вызывающему абоненту решить прекратить:
public class CancelIndicator
{
public boolean shouldCancel;
};
CancelIndicator cancel = new CancelIndicator();
while (!cancel.shouldCancel)
{
int number = /* ... */;
myMethod(number, cancel);
}
int myMethod(int number, CancelIndicator cancel)
{
// TODO - do stuff.
cancel.shouldCancel = (number == -10);
return /* ... */;
}
Или, может быть, вы больше поклонник исключений:
Вариант 3:
public class CancellationException extends Exception
{
}
try
{
for (;;)
{
int number = /* ... */;
myMethod(numberl);
}
}
catch (CancellationException ex)
{
}
void myMethod(int number) throws CancellationException
{
// TODO - do stuff.
if (number == -10)
throw new CancellationException();
}
Как видите, есть несколько вариантов. Я уверен, что можно провести целый день, обсуждая разные способы сделать это. Вот мой пример идиом, которые я видел - я предупреждаю вас, что прошло много времени с тех пор, как я много сделал на Java, поэтому я мог бы не написать здесь самый идиоматический код. : -)