在java中是否有类似于StringBuilder的boolean?

时间:2011-07-01 07:23:23

标签: java

我希望自定义函数修改/切换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类型的变量做同样的事吗?

4 个答案:

答案 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的使用情况的引用。

假设:

  1. 您将StringBuilder的引用传递给您的方法。字符串在方法中更改。如果是这种情况,那么请参阅@Gordon Murray Dent的回答。

  2. 您的布尔标志在方法中可见但未传递。一个简单的Boolean即可。

  3. 包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;
}

您可能会或可能不会发现更具可读性。