java断言类代码 java中断言有哪几种形式( 三 )


-ea和-da的全名为-enableassertions和-disenableassertions,全名和缩写名有同样的功能 。下面表示了参数及其含义 。
参数 例子 说明
-ea java -ea 打开所有用户类的assertion
-da java -da 关闭所有用户类的assertion
-ea: java -ea:MyClass1 打开MyClass1的assertion
-da: java -da: MyClass1 关闭MyClass1的assertion
-ea: java -ea:pkg1 打开pkg1包的assertion
-da: java -da:pkg1 关闭pkg1包的assertion
-ea:... java -ea:... 打开缺省包(无名包)的assertion
-da:... java -da:... 关闭缺省包(无名包)的assertion
-ea:... java -ea:pkg1... 打开pkg1包和其子包的assertion
-da:... java -da:pkg1... 关闭pkg1包和其子包的assertion
-esa java -esa 打开系统类的assertion
-dsa java -dsa 关闭系统类的assertion
综合使用 java -dsa:MyClass1:pkg1 关闭MyClass1和pkg1包的assertion
其中...代表,此包和其子包的含义 。例如我们有两个包为pkg1和pkg1.subpkg 。
那么pkg1...就代表pkg1和pkg1.subpkg两个包 。
另外,Java为了让程序也能够动态开启和关闭某些类和包的assertion功能,Java修该了Class和ClassLoader的实现,增加了几个用于操作assert的API 。下面简单说明一下几个API的作用 。
ClassLoader类中的几个相关的API:
setDefaultAssertionStatus:
用于开启/关闭assertion功能
setPackageAssertionStatus:
用于开启/关闭某些包的assertion功能
setClassAssertionStatus:
用于开启/关闭某些类的assertion功能
clearAssertionStatus:
用于关闭assertion功能
二、assertion的设计问题
首先 , 我们认为assertion是必要的 。因为,如果没有统一的assertion机制,Java程序通常使用if-then-else或者switch-case语句进行assertion检查,而且检查的数据类型也不完全相同 。
assertion机制让Java程序员用统一的方式处理assertion问题,而不是按自己的方式处理 。另外,如果用户使用自己的方式进行检查,那么这些代码在发布以后仍然将起作用,这可能会影响程序的性能 。而从语言言层次支持 assertion功能,这将把assertion对性能带来的负面影响降到最小 。
Java是通过增强一个关键字assert实现支持assertion,而不是 使用一个库函数支持,这说明Java认为assertion对于语言本身来说是非常重要的 。C语言就是 通过Assert.h函数库实现断言的支持 。
Java的assertion的开启也和C语言不太一样,我们都知道在C语言中,assertion的开启是在编译时候决定的 。当我们使用debug方式编译程序时候,assertion被开启,而使用release方式编译时候,assertion自动被关闭 。
而Java的assertion却是在运行的时候进行决定的 。其实,这两种方式是各有优缺点 。如果采用编译时决定方式,开发人员将处理两种类型的目标码,debug版本和release版本 , 这加大了文档管理的难度,但是提高了代码的运行效率 。
Java采用运行时决定的方式,这样所有的assertion信息将置于目标代码 中,同一目标代码可以选择不同方式运行 , 增强目标代码的灵活性,但是它将牺牲因为assertion而引起一部分性能损失 。
另外 , 我们注意到AssertionError作为Error的一个子类,而不 是RuntimeException 。Error代表一些异常的错误 , 通常是不可以恢复的,而 RuntimeException强调该错误在运行时才发生的特点 。AssertionError通常为非常关键的错误,这些错误往往是不容易恢复的 , 而且assertion机制也不鼓励程序员对这种错误进行恢复 。
三、assertion与继承
如果一个assert语句在父类,而当它的子类调用它时,该assert为false 。父类的assert语句将只有在父类的assert开启才起作用,如果仅仅开启子类的assert,父类的assert仍然不运行 。因此,assert语句不具有继承功能 。

推荐阅读