java - 执行函数时避免连续的“if (...)”检查
问题描述
我有一个如下所示的函数:
public Status execute() {
Status status = doSomething();
if (status != Status.ABORTED) {
status = doSomethingElse();
}
if (status != Status.ABORTED) {
status = doAgainSomethingElse(param1, param2);
}
if (status != Status.ABORTED) {
doSomethingWhichDoesntReturn(param3);
}
//etc.
return status;
}
所以基本上这个函数需要返回一个Status
. 这是由第一个函数计算的,然后在执行这些函数时由连续函数重新计算status != Status.ABORTED
。
我想重构这段代码,但我没有任何有效的想法。
如果它总是status = someFunction(someParam)
,我会使用一个列表Function<TypeInput, Status>
并在循环中执行该列表:
List<Function<TypeInput, Status>> actions = List.of(function1, function2...);
for (Function<TypeInput, Status> f : actions) {
if (status != Status.ABORTED) {
status = f.apply(input);
}
}
但问题是每个动作可能不同(有时它是一个返回的函数Status
,有时有参数但并不总是相同的大小,有时它只是一个 void 函数等)
有谁有想法吗?
注意:只要get ,我status
就Status.ABORTED
可以返回(我不需要执行函数的其余部分,因为只有在status
is not时才会执行任何操作Status.ABORTED
)。
解决方案
这看起来像是 try-catch 方法的一个很好的案例。您可以在任何一种方法中抛出异常,例如StatusAbortedException
并捕获它以返回适当的状态。它可能看起来像这样
try {
Status status = doSomethingElse();
status = doAgainSomethingElse(param1, param2);
status = doSomethingWhichDoesntReturn(param3); // this one probably does smth else
return status;
} catch (StatusAbortedException e){
// return Status.Aborted
}
推荐阅读
- ruby-on-rails - 如何从选择标签栏搜索数据
- windows - aws s3 sync --recursive 在 Windows 中不起作用
- keycloak - Keycloak: Admin-cli Add SMTP server details?
- java - 在java中从对象转换为字符串
- python - Pythonic方式以并行方式迭代字典内的列表作为字典
- google-apps-script - 通过 getLastRow 控制电子表格最后一行的确定
- java - JAR 不存在或不是普通文件
- python - 用于查找逗号在字母之前的每次正则表达式
- scala - 自定义 Akka 流
- c# - 设置 DataRowView 的值