gpt4 book ai didi

java - 我应该使用前提条件检查来检查中间结果吗?

转载 作者:搜寻专家 更新时间:2023-10-31 08:27:28 25 4
gpt4 key购买 nike

Guava 提供了辅助函数来检查先决条件,但我找不到辅助函数来检查中间结果。

private void foo(String param)
{
checkNotNull(param, "Required parameter is not set");

int x = get(param);
if (x == -1) {
throw new RuntimeException("This should never have happened and indicates a bug.");
}
}
  • 我应该将 if (...) {....} 部分包装在我自己的助手中吗?
  • 或者我应该使用 Guava 的 checkState 吗?
  • 或者我是否应该将 get() 的失败视为 param 的结果并使用 checkArgument
  • 我应该在这些情况下使用断言吗?
  • 还是我遗漏了什么?

最佳答案

它介于偏好问题和惯例问题之间。

一般来说,人们会使用断言来指示编程错误;也就是说,“如果我做对了我的工作,那么一个非空的 param 应该 neverget 中产生 -1,无论用户输入或其他外部力量。”我几乎将它们视为可以在运行时选择性地验证的注释。

另一方面,如果 get 在某些情况下可能返回 -1,但该输入无效,那么我通常会抛出一个 IllegalArgumentException,并且 checkArgument 是一种非常合理的方式来做到这一点。这样做的一个缺点是,当您稍后发现它时,它可能来自几乎任何地方。考虑:

try {
baz();
bar();
foo(myInput);
} catch (IllegalArgumentException e) {
// Where did this come from!?
// It could have come from foo(myInput), or baz(), or bar(),
// or some method that any of them invoked, or really anywhere
// in that stack.
// It could be something totally unrelated to user input, just
// a bug somewhere in my code.
// Handle it somehow...
}

在某些重要的情况下——例如,您想要向用户弹出一条有用的注释,告知他们不允许在他们的输入表单中输入 -1——您可能需要抛出自定义异常,以便您以后可以更轻松地捕获它:

try {
baz();
bar();
foo(myInput);
} catch (BadUserInputException e) {
reportError("Bad input: " + e.getMessage());
log.info("recorded bad user input", e);
}

至于checkState,我觉得不太对。该异常通常意味着问题出在 this 所在的状态(或应用程序中的其他一些更全局的状态)。来自 the docs :

Signals that a method has been invoked at an illegal or inappropriate time.

在您的情况下,-1 永远不合适,因此 checkState 具有误导性。现在,如果它是:

if (x == -1 && (!allowNegativeOne()) { ... }

...那么这会更合适,尽管它仍然有上面 IllegalArgumentException 的缺点。

因此,最后还有一个问题,您是应该保持 if 原样,还是使用辅助方法。这真的取决于品味、检查的复杂程度以及使用频率(例如,在其他方法中)。如果检查像 x == -1 一样简单,并且其他方法从未执行过该检查(因此代码重用不是问题),我会保留 if.

关于java - 我应该使用前提条件检查来检查中间结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com