Java 断言编程(第二部分)
介绍
在上一指南《使用 Java 断言编程第 1 部分》中,您学习了如何使用断言。
在本指南中,我将讨论一些使用断言的最佳实践以及在哪里不使用它们。
使用断言的最佳实践
在某些情况下,断言是正确的做法!
使用断言代替注释
出于文档目的,请尝试以下操作:
void printTotals() {
// ...
String amountStr = amountToString(amount);
// amountStr should not be null
System.out.println("Amount: " + amountStr);
// ...
}
在测试或运行程序时强制执行此检查会更好。断言可以突出显示潜在的错误:
void printTotals() {
// ...
String amountStr = amountToString(amount);
// amountStr should not be null
assert amountStr != null;
System.out.println("Amount: " + amountStr);
// ...
}
不再依赖注释和调试器。改用断言!
使用断言来验证无法访问的代码
当您不希望执行流程到达程序的某个点时,这尤其有用。如以下示例所示,您可以在switch语句的default子句中放置断言以添加额外的保护:
switch(type) {
case 1:
//...
break;
case 2:
//...
break;
case 3:
//...
break;
default:
assert false : "Default case reached";
}
但是,您必须考虑到真正无法访问的代码可能会产生编译时错误:
if(interest < 0) {
return 0;
} else {
return interest;
}
assert false : "A valid interest should be returned"; // Compile time error
使用断言验证操作的结果
不要认为断言只是用来检查输入值或强制控制流的东西。请记住,你可以在程序中的任何位置放置断言语句。
断言语句检查布尔表达式。但是,您可以使用方法检查使用复杂条件的操作结果:
String defaultPassw = generateDefaultPassword();
assert isValidPassword(defaultPassw);
许多初学者选择在这里使用打印语句。断言更进一步,实际评估代码,并在代码不符合预期时进行标记。
不要害怕用断言方法填充你的代码
你对假设的检查越多,你就越有信心在执行代码时这些假设一定能够得到满足。
即使有些事情对你来说似乎很明显,但请记住,错误可能出现在最意想不到的地方。有时很难看到条件失败的所有可能方式。
是的,这可能会使您的代码变得臃肿,但尽早修复错误和减少调试时间( AssertionError的堆栈跟踪)的优点可以帮助您查明错误的来源。
如果您担心所有断言语句都会损害您的性能,请不要担心。
首先,大多数情况下,断言操作都是简单的比较,在开发中启用,在生产中禁用。请记住,它们是内部检查,以确保开发人员的假设是正确的。它们不应该改变应用程序的行为。
但是,您可以通过将所有断言语句放在测试静态最终假值的 if 块内来利用 Java 编译器优化:
static final boolean assertsEnabled = false;
// ...
if (assertsEnabled) {
assert expr1;
assert expr2;
assert expr3;
}
这将从生成的类文件中消除if块,因为编译器足够聪明,知道它永远不会被执行。您可以在Java 语言规范的本节末尾看到这种条件编译形式的解释。
哪些情况下应避免使用断言
不要使用断言来检查公共方法中的参数
最后,断言不是最佳选择的情况。
理论上,任何有权访问其类的人都可以使用公共方法(尽管随着 Java 9 模块系统的引入,这可能并不完全正确)。最有可能的是,它们是 API 的一部分。
因此,assert 语句并不合适。可以禁用它,但该方法必须始终强制验证其参数。
此外,断言只能抛出 AssertionError。通过手动检查参数,您可以选择使用其他异常或返回错误代码。
这种做法不适用于私有方法,因为在这些情况下,您可以更好地控制应该发生的事情。
另请注意,这种做法并不是说您不应该在公共方法中使用断言,而是说您不应该使用它们来检查这些方法的输入。
不要使用断言来执行应用程序所需的操作
类似下面的做法是不好的做法,因为当断言被禁用时, newElement不会被添加:
assert list.add(newElement);
正确的做法是:
boolean elementAdded = list.add(newElement);
assert elementAdded;
下一步
在下一篇指南《使用 Java 断言编程 - 第 3 部分》中,我将讨论有关断言的一些误解并总结本系列。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~