我希望自定义函数修改/切换boolean
变量。假设我有像
if (OK2continue) { findANDclick(new String[]{"id", "menuButton"});}
if (OK2continue) { findANDclick(new String[]{"src", ".*homeicon_calendar.*"}); }
if (OK2continue) { findANDclick(new String[]{"src", ".*cycle_templates.*"});
我想确保一旦findANDclick
函数切换变量OK2continue
我管理自己的功能,使用String
修改StringBuilder
变量。
我可以为boolean
类型的变量做同样的事吗?
答案 0 :(得分:5)
我不能说它是等价的。但是使用MutableBoolean
为您提供了一个可变布尔包装器,类似于StringBuilder的一个可变字符序列的概念。有关详细信息,请参阅此JavaDoc。
答案 1 :(得分:1)
嗯,StringBuilder
的概念是创建一个可变且可扩展的String
包装器(意味着该字符串可以通过append
等扩展:))。您仍然必须将其作为参数传递给方法以进行修改(或使用静态var - 不推荐)。
由于布尔值无法扩展,唯一的相似之处是参数是可变的。所以你可以像戈登建议的那样使用MutableBoolean
,但你仍然必须通过它。
另一种选择是从boolean
返回findANDclick(...)
并使用布尔运算符,如:findAndClick(...) || findAndClick(...) || findAndClick(...)
,如果前一个返回false,则只执行下一个findAndClick(...)
。
由于该选项有点难以维护,尤其是因为您可能在findAndClick(...)
中有副作用,并且如果您有更多的呼叫,则非常静态且难以阅读,您可能需要使用列表功能对象:
class FindAndClickExecutor {
public FindAndClickExecutor(String[] params) {...}
public boolean findAndClick() {...}
}
List<FindAndClickExecutor> faces = ...; //initialize appropriately
for( FindAndClickExecutor face : faces ) {
boolean ok2continue = face.findAndClick();
if( !ok2continue ) {
break;
}
}
编辑:由于似乎还有其他方法,您可以使用更通用的列表:
interface Executor {
boolean execute();
}
class FindAndClickExecutor implements Executor {
public boolean execute() {} // findAndClick code here, set parameters using constructor
}
class FindAndSelectOptionExecutor implements Executor {
public boolean execute() {} // findAndSelectOption code here
}
List<Executor> testCase1Sequence = ...; //initialize test case 1
List<Executor> testCase2Sequence = ...; //initialize test case 2
for( Executor ex : testCase1Sequence ) {
boolean ok2continue = ex.execute();
if( !ok2continue) {
break;
}
}
这个例子也可以扩展,例如通过使用包含continue标志和更多数据的更复杂的返回值(此处也使用接口)。
编辑2:您还可以使用一些脚本来定义,并使用构建器模式生成每个测试用例的执行程序列表。
答案 2 :(得分:1)
您需要澄清对StringBuilder
的使用情况的引用。
假设:
您将StringBuilder的引用传递给您的方法。字符串在方法中更改。如果是这种情况,那么请参阅@Gordon Murray Dent的回答。
您的布尔标志在方法中可见但未传递。一个简单的Boolean
即可。
包sof_6232851;
public class SideEffectingMethod {
static Boolean flag = false;
public static void main(String[] args) {
flag = true;
System.out.format ("flag is %b\n", flag);
clickMe();
System.out.format ("flag is %b\n", flag);
}
/** this method side-effects instance variable flag */
public static void clickMe () {
flag = !flag;
}
}
[编辑项目#2以回复OP评论]:
请注意,不建议使用#2。你提到了你对“可读”代码的渴望。副作用方法不利于该目标。
public class ReturnValuesForFunAndProfit {
public static void main(String[] args) {
presentUI();
}
public static void presentUI() {
if(!clickMe("woof")) return;
if(!clickMe("meow")) return;
if(!clickMe("hello")) return;
}
public static boolean clickMe (String blah) {
// your logic here; this ex. always returns true
return true;
}
}
答案 3 :(得分:1)
将此代码推送到自己的方法中,并使用return:
if (findANDclick(new String[]{"id", "menuButton"})) return;
if (findANDclick(new String[]{"src", ".*homeicon_calendar.*"})) return;
if (findANDclick(new String[]{"src", ".*cycle_templates.*"})) return;
鉴于您的所有方法调用都相同,您还可以使用循环:
String[][] buttons = {
{"id", "menuButton"},
{"src", ".*homeicon_calendar.*"},
{"src", ".*cycle_templates.*"},
};
for (String[] button: buttons) {
if (findANDclick(button)) return;
}
您可能会或可能不会发现更具可读性。