很抱歉提出这个问题我已经看到它被问了很多但不是我认为的方式。
我的目标是创建一个重试函数,它会循环'n'时间来尝试运行我作为参数传递的方法。
所以在这种情况下我想运行函数“myFunction()”,但我知道有时返回的值是false,我想运行它直到返回值为真。
这就是我希望它运行的方式:
public static void main (String [] args){
boolean did work = retry (myFunction(),5)
if(didwork){
System.out.println("I found my stuff");
} else {
System.out.println("I didn't found my stuff");
}
}
public boolean retry (Function function, int loopTry){
boolean success = false;
for(int i=0 ; i<loopTry ; i++){
success = function.run();
if(success){
break;
}
}
return success;
}
public boolean myFunction(){
boolean found = false;
//do stuff
if(stuff){
found = true;
}
return found;
}
我知道这是不可能的(至少在java 7中可能是8)
我已经看到一些答案建议为特定函数等创建一个对象...但是这不会使重试函数变得通用,因为我需要为每个我想重试的方法重新创建一个对象。这不是我想要的。
所以我想知道是否有一种“干净”的方式(即使在java 8中)也没有?
谢谢
答案 0 :(得分:1)
您可以在此处尝试reflection
:
E.g:
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Method method = Test.class.getMethod("myFunction");
boolean didwork = retry(method, 5);
if (didwork) {
System.out.println("I found my stuff");
} else {
System.out.println("I didn't found my stuff");
}
}
public static boolean retry(Method method, int loopTry)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
boolean success = false;
for (int i = 0; i < loopTry; i++) {
success = (Boolean) method.invoke(null);
if (success) {
break;
}
}
return success;
}
public static boolean myFunction() {
boolean found = false;
//do stuff
if(stuff){
found = true;
}
return found;
}
答案 1 :(得分:0)
你可以在myFunction()中添加一个while循环,它在函数内“重试”。这只是一个额外的路线。如果将最大尝试次数定义为n,则最多两个或三个。在第二种情况下,您重新创建了尝试的效果,直到您获得真或直到达到尝试的数字。