Java中的断言和契约设计
按合同设计的技术规定了一个应用程序中各个组件之间的交互。这一概念最早是在Eiffel编程语言中发现并引入的。
为了实现各个组件之间的交互,基于应用程序的各个组件之间相互通信的契约是由这个概念来定义的。
断言在契约设计技术中被用来检查应用程序是否满足定义的契约中指定的要求。它们被用来测试程序员的假设。
前提条件
在学习本教程之前,你需要有Java的基本知识。你还需要能够使用IDE,如[Netbeans]和[IntelliJ]。
契约式设计
这种技术允许程序员提供一个详细的规范,以根据用户的要求来创建软件。基于给定的规范,程序员将开发出软件。
按合同设计技术有三种不同类型的断言,用于检查基于所给规格的软件的合规性。
这些断言的类型是。
- 前提条件:在调用外部组件之前,应用程序必须满足指定的条件。
- 后置条件:指定的条件必须在外部条件被执行后由应用程序满足。
- 不变性:指定的条件必须被应用程序满足。
为了理解断言的技术,我们将考虑堆栈的操作。
当从堆栈中提取一个元素时,堆栈不应该是空的。因此,在从堆栈中提取一个元素之前要检查这个条件。这个条件被称为前提条件。
将一个元素推入堆栈,我们需要检查该元素是否被正确地添加到指定的索引中。这个条件被称为后条件。
一个不变的条件是当一个堆栈的元素数量不应该超过它的承载能力或等于空0。
实现断言
一个assertion ,是一个带有布尔表达式的语句,程序员假定其为真。因此,如果表达式为假,程序的执行就会继续。假设程序是正确的,没有错误。
一旦表达式为假,就会抛出一个AssertionError 异常,并包含错误的细节。这就是程序中错误所在的行号和文件。
为了在Java中实现断言,我们使用assert语句。assert语句可以用两种方式实现。
assert Expression 1;
表达式是一个布尔值,如果布尔值报告是假的,则抛出断言错误,没有关于程序中发生的错误信息。
assert Expression 1; Expression 2;
第一个表达式是布尔值,第二个表达式是传递给AssertError 的Exception的值。我们可以使用断言语句作为。
public void division()
{
double a = b / c; ///c should not be equal to zero
}
上面的注释可以用assert语句来代替。
public void division()
{
assert c != 0 /// this assert statement states that c should not be equal to zero
double a = b / c
}
如果assert语句的表达式是假的,就会抛出一个错误,指明程序有错误。这被称为assertion failure 。
启用和禁用断言
Java提供了命令行参数,使我们能够启用和禁用断言。启用断言是通过以下参数完成的。
-ea
or
-enableassertions
从文件中启用断言Myfile.java ,我们使用命令。
java -enableassertions Myfile.java
或
java -ea Myfile.java
禁用断言,我们使用命令行参数。
-da
or
disableassertions
从文件Myfile.java 中禁用断言,我们使用命令。
java -disableassertions Myfile.java
或
java -da Myfile.java
启用断言的命令行
Java -ea- 这个命令行在所有的类中启用,除了系统类。Java -ea Main- 这个命令行为所有的主类启用断言。Java -eaTestClass Main- 该命令行在一个类中启用唯一的断言--主程序中的TestClass。Java -ea...Main- 该命令用于启用主目录中工作类的断言。
断言规则
由于断言是用来检查程序员在执行时做出的假设是否有效,所以有一些规则来管理它们的使用。
- 检查传递的方法参数。
- 在switch语句的默认情况下使用断言。
- 利用断言的描述性。
- 避免在一个断言条件下进行处理。
- 避免捕捉一个与断言相关的异常。
- 避免在一个断言中使用一个以上的条件
创建一个Java程序
这个程序帮助学习者通过除以两个数字来实现断言。
public class division
{
void assertcheck(int b,int c)
{
assert c != 0: "The value c cannnot be zero"; /// ensures that thevalue of c should not be zero
double a = b / c;
System.out.println("the result is:" + a);
}
public static void main(String args[])
{
division div = new division();
div.assertcheck(5, 0);
}
}
上面的程序使用断言语句对两个变量进行除法测试,确保分母不等于零。
由于c 的值等于零,所以抛出了一个Assertionerror 。
断言和异常之间的区别
- 断言的目的是检测发生的编程错误,而异常是用来指示其他类型的错误,如丢失的文件和无效的用户输入。
- 断言测试程序员假设的条件,确保程序正确运行,而断言将测试异常条件,不确保程序的有效运行。
- 断言用于检查不应该发生的事情,而异常应该检查可以或可能发生的事情。
总结
在这篇文章中,我们看了断言,它是你作为一个程序员做出的假设。
这些假设应该是正确的,以避免在程序的功能中出现错误。作为一个程序员,你需要了解如何应用和使用断言来确保程序的正确流程。