为什么
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/