追求代码质量: 用 AOP 进行防御性编程
2009-11-19 00:00:00 来源:WEB开发网通过标注指定这个约束条件意味着我的代码不再会被重复的条件弄得乱七八糟,这些条件检查 null 值,并且一旦找到该值就会抛出异常。现在这项逻辑由 OVal 处理,且处理的方法有些相似 —— 事实上,如果违反了约束条件,OVal 会抛出一个 ConstraintsViolatedException,它是 RuntimeException 的子类。
当然,我下一步就要编译 HierarchyBuilder 类和 清单 5 中相应的 DefaultGuardAspect 类。我用 清单 6 中的 iajc 任务来实现这一目的,这样我就能把 OVal 的行为编入我的代码中了。
接下来,我更新 清单 4 中的测试用例来验证是否抛出了一个 ConstraintsViolatedException,如清单 8 所示:
清单 8. 验证是否抛出了 ConstraintsViolatedException@Test(expectedExceptions={ConstraintsViolatedException.class})
public void verifyHierarchyNull() throws Exception{
Class clzz = null;
HierarchyBuilder.buildHierarchy(clzz);
}
指定后置条件
正如您所见,指定前置条件其实相当容易,指定后置条件的过程也是一样。例如,如果我想对所有调用 buildHierarchy 的程序保证它不会返回 null 值(这样,这些调用程序就不需要再检查这个了),我可以在方法声明之上放置一个 @NotNull 标注,如清单 9 所示:
清单 9. OVal 中的后置条件 @NotNull
public static Hierarchy buildHierarchy(@NotNull Class clzz){
//method body
}
当然,@NotNull 绝不是 OVal 提供的惟一约束条件,但我发现它能非常有效地限制这些令人讨厌的 NullPointerException,或至少能够快速地暴露 它们。
更多精彩
赞助商链接