有什么方法可以从loop
返回一个值并从我离开的地方继续?
在以下代码段中,我想返回currVm
的当前值。但我无法这样做。
在片段的最里面的循环中:
while(c <= currVm) {
allocatedVm(currVm);
c++;
}
调用名为allocatedVm
的函数。我想返回currVm
的值,然后从我离开的地方重新开始。有什么出路吗?
@Override
public int getNextAvailableVm() {
Set<String> dataCenters = confMap.keySet();
for (String dataCenter : dataCenters) {
LinkedList<DepConfAttr> list = confMap.get(dataCenter);
Collections.sort(list, new MemoryComparator());
int size = list.size() - 1;
int count = 0;
while(size >= 0) {
DepConfAttr dca = (DepConfAttr)list.get(count);
int currVm = dca.getVmCount();
int c = 0;
while(c <= currVm) {
allocatedVm(currVm); // RETURN currVm
c++;
}
count++;
size--;
}
}
}
答案 0 :(得分:2)
最好的方法可能是编写一个返回Iterable<Integer>
的方法。这在Java中并不像支持生成器函数的语言那样容易(例如C#和Python),但它仍然可行。如果代码很短,你就可以使用一对(嵌套的)匿名内部类:
public Iterable<Integer> foo() {
return new Iterable<Integer>() {
@Override public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
// Implement hasNext, next and remove here
};
}
};
}
在你的情况下,我很想把它分成一个单独的非匿名类,但为了简单起见。
无论如何,使用Iterable
的重点是Iterator
自然有状态 - 基本上就是它的目的。所以它非常适合您的要求。
另一种相当简单的方法是一次性返回所有元素,并使调用者按需执行分配。显然,如果可能存在大量元素,那么效果不会很好,但它会更容易理解。
答案 1 :(得分:0)
不确定我理解你需要什么,但是:
如果您希望在方法运行期间通知调用方您已获得值的方法,但不希望退出该方法,则可以使用侦听器。
只需创建一个接口作为函数的参数,并在其中包含一个将对象作为参数的函数。
示例:
interface IGotValueListener
{
public void onGotValue(MyClass obj);
}
public int getNextAvailableVm(IGotValueListener listener)
{
...
if(listener!=null)
listener.onGotValue(...);
}
现在,为了调用方法,你可以:
int finalResult=getNextAvailableVm(new IGotValueListener ()
{
... //implement onGotValue
};
答案 2 :(得分:-1)
只需输入return
关键字,即可从方法中的任何位置返回。如果你想从不同的地方放置一个功能来恢复你的方法,那么你需要以这种方式考虑你的方法。您可以使用labels
和if
语句,设置一些静态变量来标记最后一个执行位置。如果您的应用程序不是多线程的,那么您不必担心使用静态变量同步。此外,如果你的方法太大而且难以跟踪/阅读,那么请考虑将其分解为较小的方法。