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));