java契约式设计

标签 java

为什么

1) 您可以在公共(public)和非公共(public)方法中使用断言测试后置条件

但是,建议您

2) 不使用断言来检查公共(public)方法的参数(前提条件)

我了解 2) 是由以下原因引起的: - 约定:该方法保证它将始终执行参数检查(例如,检查异常),因此无论断言是否启用,它都必须检查其参数。 - assert 构造不会抛出指定类型的异常。它只能抛出一个 AssertionError,这对用户来说不是很友好

但我不明白为什么 1) 也可用于公共(public)方法?

谢谢。

以上质疑改写 :) 契约(Contract)由两部分组成:

- requirements upon the caller made by the class
- promises made by the class to the caller

为什么 Sun 建议您不要将断言用作公共(public)方法的前置条件,因为断言可能会被禁用,这样您就不会检查强加给调用者的要求,但允许您使用断言来测试公共(public)方法的后置条件(测试返回值以查看您返回的是正确的结果)对我来说仍然是个谜。

换句话说,执行要求时必须非常小心,但在验证 promise 时可以闭上眼睛。

当您强制客户遵守要求时,是否存在技术原因,这种比喻称为“缺乏道德”? :)

最佳答案

第 2 点指出你不应该使用断言,因为它们可能不会被打开。相反,它似乎建议使用每次都执行并抛出检查异常的检查。

如果你想在启用断言时抛出不同的异常,你可以这样做

boolean assertions = false;
assert assertions = true;
if (assertions && myCheckHere) throw new MyExceptionOrError();

从技术上讲,一个方法有参数,例如字符串名称,一个方法被调用并传递参数,例如“你好”,所以它是你要检查的参数,编译器将检查参数。

关于java契约式设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4528160/

相关文章:

java - "Unable to instantiate activity"错误

java - 当我们使用 new 运算符时,究竟什么时候在字符串常量池中创建对象。?

java - 使用 Eclipse IDE 的 Java 代码中的 Class.forName 问题

java - MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

java - 任何java静态/动态代码分析工具来查找我的java项目中的所有递归方法

java - Tomcat应用部署监听器

java - 在java中导入文件

java - 在根项目 gradle 上找不到属性 'sourceSets'

java - 在 ZooKeeper 中,有没有办法不用自己实现分布式锁,原子地编写层次结构?

java - 从部署在 tomcat 服务器中的 JSP 打开共享本地文件夹(C 盘或 D 盘等)