Java 向Google Guava';s的先决条件。*方法?
例如,在使用时,错误消息应该反映问题中的检查的通过情况还是失败情况Java 向Google Guava';s的先决条件。*方法?,java,exception,guava,preconditions,Java,Exception,Guava,Preconditions,例如,在使用时,错误消息应该反映问题中的检查的通过情况还是失败情况 import static com.google.common.base.Preconditions.*; void doStuff(int a, int b) { checkArgument(a == b, "a == b"); // OR checkArgument(a == b, "a != b"); } 文档中给出了一些示例,这些示例使用文字而不是符号来说明问题: checkArgument(count
import static com.google.common.base.Preconditions.*;
void doStuff(int a, int b) {
checkArgument(a == b, "a == b");
// OR
checkArgument(a == b, "a != b");
}
文档中给出了一些示例,这些示例使用文字而不是符号来说明问题:
checkArgument(count > 0, "must be positive: %s", count);
考虑到这些基本上只是日志(或调试会话)中的异常消息,请执行任何您认为对任何查看问题的人或任何阅读代码以理解前提条件的人来说最清楚的操作
例如,您可以将上述内容重写为:
checkArgument(count > 0, "count must be positive; was actually %s", count);
对于先决条件检查,在异常详细信息消息中说明需求比简单说明事实更具信息性。它还导致更自然地阅读代码: 提供了以下示例: 这允许构造,例如
if (count <= 0) {
throw new IllegalArgumentException("must be positive: " + count);
}
有两点值得注意:
- 该示例清楚地说明了需求,而不是事实
- “某些事情必须是对的”,而不是“某些事情是错的”
- 通过反转检查条件,整个构造的读取更加自然
checkArgument(a == b, "a must be equal to b"); // natural!
您甚至可以更进一步,在异常消息中捕获a
和b
的值(请参阅有效Java第二版,第63项:在详细消息中包含故障捕获信息):
在代码中,陈述事实的替代方法不太自然:
checkArgument(a == b, "a != b"); // awkward!
checkArgument(a == b, "a is not equal to b"); // awkward!
请注意,在Java代码中读取一个布尔表达式,后跟一个与该表达式相矛盾的字符串是多么尴尬
陈述事实的另一个缺点是,对于复杂的先决条件,它的信息量可能较小,因为用户可能已经知道事实,但不知道违反的实际需求是什么
相关问题
- 就我个人而言,对于这样的事情,我想我会写
checkArgument(a == b, "a (%s) must equal b (%s)", a, b);
通常(大多数情况下)您可以只使用checkArgument()方法而不使用error message参数,也就是说,根本不提供错误消息
要生成一条好的错误消息,需要了解谁将阅读该消息。它不是最终用户;如果先决条件失败,则最有可能指向代码中的错误。文本可以解释失败的前提条件,但在大多数情况下,它对最终用户没有任何用处,应该是对程序员的提示。大多数情况下,如果没有堆栈跟踪和源代码,消息本身也没有意义。事实上,在大多数情况下,stacktrace和源代码正是程序员修复bug所需要的,错误消息没有帮助。如果先决条件不明显,则在其旁边添加注释是记录该先决条件的完美方式
在没有人真正关心文本的情况下,总是需要提供错误消息,这会导致程序员生成无用的、明显的、没有帮助的消息,这只会降低代码的可读性
在某些情况下,错误消息可能很有用,例如,消息可以包含变量的实际值,但根据我们的经验,这并不常见,在这些情况下,您可以使用消息
类似的参数也适用于JUnit中的assert方法;始终提供错误消息不是一个好主意
此外,当您在库中而不是在为最终用户使用应用程序时,情况可能会有所不同,因为您不知道如何使用代码。正如所指出的:
对于先决条件检查,在异常详细信息消息中说明需求比简单说明事实更具信息性 虽然您当然可以使用番石榴前提条件(我编写的)来实现这一点,但它可以让您在不付出任何努力的情况下获得更好的输出 番石榴先决条件
String a = "foosball";
String b = "ballroom";
Preconditions.checkArgument(a == b, "a == b");
给你这个:
java.lang.IllegalArgumentException: a == b
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
at Main.main(Main.java:142)
需求API
String a = "foosball";
String b = "ballroom";
requireThat(a, "a").isEqualTo(b, "b")
给你这个:
java.lang.IllegalArgumentException: a == b
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
at Main.main(Main.java:142)
相同的输入,更好的输出
(如果您的终端不支持颜色,您将获得文本差异)在我给出的示例中,您更喜欢哪种颜色?@Brian:我真的不喜欢这两种颜色。它们都没有显示a和b的值,如果没有这两个值或一条有意义的信息,我不愿意假设太多。如果我被迫在两者之间选择,我可能更喜欢后者。。。但我真的建议使用更有意义的东西。
String a = "foosball";
String b = "ballroom";
requireThat(a, "a").isEqualTo(b, "b")