我知道java中存在关键字assert
。但是我不记得看到使用它的代码。可能我正在使用异常并登录我可以使用它的地方。在java中使用assert
关键字是一种好习惯吗?
编辑:我知道断言总的来说是一种好习惯。我的问题是,更准确一点,如果在java中断言的BKM使用assert
关键字而不是使用异常,日志记录和其他技术。
答案 0 :(得分:23)
未使用断言的主要原因是因为默认情况下未启用它们。因此,如果您的条件非常重要,需要断言,则不能依赖启用断言来完成工作。
正如其他答案已正确陈述的那样,它们专为开发时测试和调试而设计,因为如果在生产中禁用断言,它们就不会花费任何成本。我认为最好在测试框架中创建显式测试(例如边缘条件的单元测试),而不是依赖于在测试时启用断言的人。
然而,我见过使用断言的一个好例子是检查私有方法参数。由于您控制对这些方法的访问,因此您可以检查您自己的类是否正确使用该方法,而您的公共方法使用更可靠的参数检查技术(注释,if语句,第三方库等)。这样,即使断言被禁用,您的方法也应该受到保护,但是查看源代码的开发人员可以查看您的方法的前提条件,并在处理该类时为其他安全网打开断言。
答案 1 :(得分:13)
当我用C ++编写时,我使用断言的次数远远多于使用Java时的断言。我没有那么多使用它们,因为我不再需要它们了。我试图用断言捕获的许多C ++错误在Java中不再是一个问题。
话虽如此,断言是非常有价值的,但许多人并没有使用它们,部分原因是因为他们不了解它们。我听说有人抱怨他们抛出错误而不是异常。我也听过这个问题:你为什么不只是使用异常处理案例而不是使用断言?
我对两者的回复是一样的。断言不应该捕获您希望在工作应用程序中看到的案例。断言的目的是捕获错误。你应该只使用它们来“处理”它们的唯一方法是返回并修复代码。这就是为什么他们不抛出异常 - 你不希望它们成为你的一般异常处理的一部分。
至于打开它们,我的IDE设置为默认打开它们。所以,对于我的内部测试,我总是知道他们正在进行。
这是一个断言是唯一可以使用的例子:我在一个大型Swing项目中工作,原始编码器不明白UI只能从事件线程更新,这会导致各种错误。所以我在许多地方放置了这个断言,事情表现得很有趣:断言EventQueue.isDispatchThread();如果这个断言被触发,我们从错误的线程运行,开发人员需要得到通知,以便他们可以将代码移动到正确的线程。在一个有效的应用程序中处理这个问题没办法。
答案 2 :(得分:8)
是的,这很奇怪。该功能被高度要求,但在引入该语言之后,几乎没有人使用它。
我有时使用assert作为评论工具。而不是
// now it should be empty
我可以写
assert size == 0;
但我并没有真正开启assert
,因此断言从未经过测试。
人们可能更喜欢从外部测试代码,他们觉得不需要在代码流中植入很多断言。
答案 3 :(得分:4)
是的,断言你的假设是一种很好的做法。阅读Design By Contract。 assert可用于在集成和测试阶段验证前置条件,不变量和后置条件。这有助于在开发和测试阶段捕获错误。您可以安全地将其关闭以避免性能问题。
断言通常用于检查内部方法逻辑的正确性或在给定的类中强制执行合同。但是使用例外来明确合同。
答案 4 :(得分:2)
Assert目前使用不多。它在开发期间的性能关键应用程序中非常有用,可以清除所有错误,然后通过交换机简单地禁用断言。
在运行时禁用断言是主要的好处,因为在禁用时,它们基本上使用零资源。
更“现代”的方法是,例如,将Google Guava与Preconditions一起使用。这是一种库类型断言机制,您可以在必须满足条件时使用它,并且您不想在Java开关中摸索。
答案 5 :(得分:1)
嗯,这实际上取决于你如何看待它,但是,建议。
例如,如果您编写方法 计算a的速度 粒子,你可能会断言 计算出的速度小于 光速。
答案 6 :(得分:1)
For example, to prove that sort+reverse is equivalent to sort in reverse order:
Method 1: sort(int[] arr, int len)
// pre: len is the length of the array arr
// post: arr is sorted in ascending order
Method 2: reverse(int[] arr)
// post: the order of elements in arr is
// reversed (e.g. [9 5 10] -> [10 5 9])
Assertion 1: the length of arr is len
sort(arr,len);
Assertion 2: arr is sorted in ascending order
reverse(arr);
Assertion 3: the order of arr is reversed
答案 7 :(得分:1)
在我的java应用程序中使用断言时,我非常高兴,sqlite-jdbc为一个案例返回了一些智能断言。
因此,如果您启用断言,它们可能会出现在某些第三方库中。
答案 8 :(得分:0)
是。这是一种验证某些“必须”条件得到满足的方法。请注意,您必须显式启用断言。
否则你可以使用commons-lang中的Validate
。您只需编写Validate.notNull(foo)
,如果foo
为null
,则会引发异常。
答案 9 :(得分:0)
这对短期条件有利。但是,使用取决于您的编码实践。因为,有时使用“断言”然后使用强硬的方法可以更好地应用逻辑!
答案 10 :(得分:0)
未使用断言的主要原因是因为默认情况下未启用它们。因此,如果您的条件非常重要,需要断言,则不能依赖启用断言来完成工作。
我同意断言的重大设计错误是它们默认是禁用的。
因此我把
static { AssertionUtil.enableAssertionsForThisClass(); }
在每个班级的顶部。请参阅http://commons.unkrig.de。