Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 停止方法链而不返回布尔值_Java_Boolean - Fatal编程技术网

Java 停止方法链而不返回布尔值

Java 停止方法链而不返回布尔值,java,boolean,Java,Boolean,我毫不怀疑,有一个解决方案张贴了这一点,但我无法找到搜索词检索它,因此,如果它确实存在,请告诉我的副本,并标记这一点 我有一系列方法对一个按钮单击事件执行各种验证检查,如果验证失败,我会显示一条消息,目前我的解决方案是,然后传回一个布尔值,这样,如果该方法失败,其余的方法将不会运行 我不喜欢这样,当我有几个方法都返回布尔值时,我的代码开始有味道 有更好的解决办法吗?我不想使用实例变量 当前代码的示例: private void SUBMIT_BUTTON_CLICK(){ if

我毫不怀疑,有一个解决方案张贴了这一点,但我无法找到搜索词检索它,因此,如果它确实存在,请告诉我的副本,并标记这一点

我有一系列方法对一个按钮单击事件执行各种验证检查,如果验证失败,我会显示一条消息,目前我的解决方案是,然后传回一个布尔值,这样,如果该方法失败,其余的方法将不会运行

我不喜欢这样,当我有几个方法都返回布尔值时,我的代码开始有味道

有更好的解决办法吗?我不想使用实例变量

当前代码的示例:

private void SUBMIT_BUTTON_CLICK(){

        if(validate()){

        //Do Stuff

    }
}

private boolean validate(){

    return checkOne() && checkTow() && checkThree() && checkFour();

}

private boolean checkOne(){

    if (someCheckFails) {

        print(warning);
        return false;

    } else {
        return true;
    }
}

private boolean checkTow(){

    if (someCheckFails) {

        print(warning);
        return false;

    } else {
        return true;
    }

}

private boolean checkThree(){

    if (someCheckFails) {

        print(warning);
        return false;

    } else {
        return true;
    }
}

private boolean checkFour(){

    if (someCheckFails) {

        print(warning);
        return false;

    } else {
        return true;
    }
}

像你现在这样的链接通常是最好的解决方案。它易于理解、高效且相对简洁

其他几个想法是:

private void validate() throws ValidationException {
    checkOne(); 
    checkTow(); 
    checkThree(); 
    checkFour();
}
构建一个谓词数组,然后迭代并调用它们,或者 使用异常和异常处理 但这两种方法都有性能方面的影响,只有在有大量谓词需要评估的情况下,它们才能提供更清晰的代码

有时候,一个不雅观的解决方案比寻找一个聪明的解决方案更优雅

考虑一下:如果我使用异常,我可以重写validate方法

作为

但我在这里实际赚了多少钱?它仍然是两行代码。如果我要遵循Java的风格规则,它将是:

private void validate() throws ValidationException {
    checkOne(); 
    checkTow(); 
    checkThree(); 
    checkFour();
}

这比我们开始的要多。我们还没有考虑谓词本身或处理验证异常的代码。

像您目前所做的链接通常是最好的解决方案。它易于理解、高效且相对简洁

其他几个想法是:

private void validate() throws ValidationException {
    checkOne(); 
    checkTow(); 
    checkThree(); 
    checkFour();
}
构建一个谓词数组,然后迭代并调用它们,或者 使用异常和异常处理 但这两种方法都有性能方面的影响,只有在有大量谓词需要评估的情况下,它们才能提供更清晰的代码

有时候,一个不雅观的解决方案比寻找一个聪明的解决方案更优雅

考虑一下:如果我使用异常,我可以重写validate方法

作为

但我在这里实际赚了多少钱?它仍然是两行代码。如果我要遵循Java的风格规则,它将是:

private void validate() throws ValidationException {
    checkOne(); 
    checkTow(); 
    checkThree(); 
    checkFour();
}

这比我们开始的要多。我们还没有考虑谓词本身或处理验证异常的代码。

根据我的评论:您可能正在寻找异常

伪代码示例:

void checkOne() {
  if( check_fails ) {
    throw new CheckOneException();
  }
}

void checkTwo() {
  if( check_fails ) {
    throw new CheckTwoException();
  }
}

void validate() {
  checkOne();
  checkTwo();
}

void SUBMIT_BUTTON_CLICK() {
  try {
    validate();

    //Do Stuff
  } catch( CheckOneException | CheckTwoException ) {
    //handle the exceptions
  }
}
请注意,您可能必须声明要抛出的异常,或者使它们成为运行时异常


此外,如果处理取决于异常的类型,则可能需要使用多个catch块。或者,如果符合您的需要,您也可以抛出相同类型的异常。

根据我的评论:您可能正在寻找异常

伪代码示例:

void checkOne() {
  if( check_fails ) {
    throw new CheckOneException();
  }
}

void checkTwo() {
  if( check_fails ) {
    throw new CheckTwoException();
  }
}

void validate() {
  checkOne();
  checkTwo();
}

void SUBMIT_BUTTON_CLICK() {
  try {
    validate();

    //Do Stuff
  } catch( CheckOneException | CheckTwoException ) {
    //handle the exceptions
  }
}
请注意,您可能必须声明要抛出的异常,或者使它们成为运行时异常


此外,如果处理取决于异常的类型,则可能需要使用多个catch块。或者,如果符合您的需要,您也可以抛出相同类型的异常。

通常您会使用异常:

void check1(Foo value) {
    if(some test on value) {
        throw new ValidationException(...);
    }
}


try {
    check1(value);
    check2(value);
} catch (ValidationException e) {
    // deal with validation failure
}
这里的一个好处是,异常可以携带有关失败的信息。你的布尔false只是说它失败了,没有任何解释

当然,另一个好处是,您可以自由地将异常传递到调用堆栈的更高层,其他代码可以在那里处理它

有些人担心构建异常的成本,或者更准确地说,收集其中包含的堆栈跟踪的成本。我建议不要担心它,除非您遇到性能问题,并且分析指出异常

不过,还有其他选择。例如,您的验证可以返回可选的:

或具有方法引用的等效项,例如this::check1


正如你所看到的,有很多的可能性。但是想想你是否把事情复杂化了。您已经采用的简单方法基本上没有什么固有的错误——尽管返回故障原因比将其作为副作用打印出来更好,也更易于测试。

通常您会使用异常:

void check1(Foo value) {
    if(some test on value) {
        throw new ValidationException(...);
    }
}


try {
    check1(value);
    check2(value);
} catch (ValidationException e) {
    // deal with validation failure
}
这里的一个好处是,异常可以携带有关失败的信息。你的布尔false只是说它失败了,没有任何解释

当然,另一个好处是,您可以自由地将异常传递到调用堆栈的更高层,其他代码可以在那里处理它

有些人担心构建异常的成本,或者更准确地说,收集其中包含的堆栈跟踪的成本。我建议不要担心它,除非您遇到性能问题,并且分析指出异常

不过,还有其他选择。比如你的 验证可能返回可选的:

或具有方法引用的等效项,例如this::check1


正如你所看到的,有很多的可能性。但是想想你是否把事情复杂化了。您已经拥有的简单方法基本上没有什么固有的错误-尽管返回失败原因比将其作为副作用打印出来更好,也更容易测试。

这看起来像是您想要使用异常,例如,类似这样的东西try{validate;performTheNormalOperation;}捕获您期望的异常{handleException;}@Thomas你应该把它写下来作为答案。你可以通过重用布尔printIfFalseSting s,boolean b{if!b{prints;}返回b来节省一些重复。然后你的检查都包含return printIfFalsewarning,sometest;看起来你想使用异常,例如,类似这样的尝试{validate;performTheNormalOperation;}捕获您期望的异常值e{handleException;}@Thomas您应该将其作为一个答案来写。您可以通过重用布尔printiffalstesting s、布尔b{if!b{prints;}来避免一些重复返回b。然后您的检查都包含返回打印iffalsewarning,sometest;我喜欢这个解决方案,但最终它并没有比我已经做的更干净。@Johntk是的,它没有那么干净。但是,这取决于您的需要:减少代码行并不总是一件好事,如果这是您唯一的目标,您可以坚持r方法。如果性能不是太大问题,您也可以尝试一些基于规则的方法,例如,使用一个系统,您可以将验证规则和要验证的数据提供给您所需的验证规则和数据,然后将其传递给其他人。与您的方法相比,异常的优点是可以将信息传递到有效的位置和原因失败了。我喜欢这个解决方案,但最终它并没有我现在做的那么干净。@Johntk是的,它并没有那么干净。但是,这取决于你的需要:减少代码行并不总是一件好事,如果这是你唯一的目标,你也可以坚持自己的方式。如果性能不是一个太大的问题,你可以ld还尝试一些基于规则的方法,即使用一个系统,您可以将验证规则和要验证的数据提供给您所需要的任何人,并将其传递给其他人。与您的方法相比,异常的优势在于可以传递验证失败的位置和原因。是的,从我在这里收到的答案来看比如我目前的不雅解决方案就足够了。是的,从我在这里收到的答案来看,我目前的不雅解决方案就足够了。一些不错的替代方案,但正如你所指出的,我认为在当前的实现中使用这些方案会使它过于复杂。一些不错的替代方案,但正如你所指出的,我认为我在当前的实施过程中,使用任何这些都会使it变得过于复杂。
checks.stream().allMatch(check -> check.test(value));