2

有什么方法可以从 a 返回一个值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--;
        }
    }        
}
4

3 回答 3

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 自然有状态 - 这就是它的目的,基本上。因此,它非常适合您的要求。

另一种更简单的方法是一次性返回所有元素,并让调用者按需执行分配。显然,如果可能有大量元素,那将无法正常工作,但它会更容易理解。

于 2013-08-31T07:09:06.097 回答
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
  };
于 2013-08-31T07:14:30.123 回答
-1

return只需输入关键字,您就可以从方法中的任何位置返回。如果您想添加一个功能来从不同的地方恢复您的方法,那么您需要以这种方式考虑您的方法。可以使用labelsandif语句,设置一些静态变量来标记最后执行的地方。如果您的应用程序不是多线程的,那么您不必担心使用静态变量同步。此外,如果您的方法太大并且难以理解/阅读,那么请考虑将其分解为较小的方法。

于 2013-08-31T07:01:26.123 回答