1 断言
1.1 断言的含义
断言:在开发阶段的代码中嵌入,检验某些条件是否成立,如果成立,程序运行正常,否则会抛出AssertionError,程序运行终止
断言的使用主要是测试代码的正确性,可以在一定程度上保证代码质量,而且不会影响运行时性能(在实际使用时,assertion都会被disabled)。当出现AssertionError则说明与某些rep与预期出现偏差 ,和抛出异常类似,同样可以在发生错误时输出错误信息。
例:
assert x>=0;
assert x>=0 : "x" is + x;//:之后的是抛出断言错误的信息
1.2 断言的使用
使用场景
- 内部不变量。e.g. assert x>0;
- rep不变量,通过类中定义方法实现。
public class Plane{
String type;
String name;
...
private void checkRep(){
assert type!=null;
assert name!=null;
}
public String getname(){
checkRep();
return this.name;
}
...
}
- 控制流不变量,主要用在函数无法执行到的位置或switch-case的default中
switch (choice){
case 'a': return "A";
case 'e': return "E";
...
default: assert false;
}
- 方法的前置条件和后置条件
断言使用tips
- assert在运行时将被屏蔽,不能将执行代码放在assert语句中
- 不要检查一些无意义的赋值语句
//没有意义的断言
int x = 0;
int y = x + 1;
assert y == x + 1;
- 断言是用来检查程序内部的Bug,而外部程序是使用Exception机制来处理的
- 断言处理程序不应该发生的情况;而Exception处理程序可能出现的异常
2 防御式编程
防御性编程的最佳形式首先是不插入错误。之前介绍的Exception处理机制和断言都是防御式编程的一种形式。除此之外还包括无效输入检查、设置路障等方法。
- 无效输入检查。对于来自外部输入的数据要进行检查,如文件、控制台输入等,主要对输入的格式和数据类型进行检查,比如采用正则表达式来匹配检查等
- 设置路障。对于类中public方法接收的外部数据,需要通过路障进行处理保证安全之后才能被private方法调用。
- 调试辅助。采用debug静态代码分析工具进行价差。Java中常用的工具是SpotBugs,开源git仓库:SpotBugs