Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 公共方法中的前置条件和后置条件检查_Java_Assert_Preconditions_Post Conditions - Fatal编程技术网

Java 公共方法中的前置条件和后置条件检查

Java 公共方法中的前置条件和后置条件检查,java,assert,preconditions,post-conditions,Java,Assert,Preconditions,Post Conditions,我正在阅读关于使用assert关键字验证方法先决条件和后决条件的文章 文档中说,可以使用assert关键字来验证public方法的后置条件,但只能使用assert关键字来验证private方法的先决条件 这是为什么?在所有情况下,您都应该检查public函数的参数。如果禁用了assert,则如果通过assert一个完整的答案而不是将其转储到注释中,则此类检查将无法完成 为什么我不应该在公共方法中使用断言进行参数检查? JVM标志可以禁用依赖于assert的断言。因此,无法保证断言在用户运行代码时

我正在阅读关于使用
assert
关键字验证方法先决条件和后决条件的文章

文档中说,可以使用
assert
关键字来验证
public
方法的后置条件,但只能使用
assert
关键字来验证
private
方法的先决条件


这是为什么?

在所有情况下,您都应该检查
public
函数的参数。如果禁用了
assert
,则如果通过
assert

一个完整的答案而不是将其转储到注释中,则此类检查将无法完成

为什么我不应该在公共方法中使用断言进行参数检查?

JVM标志可以禁用依赖于
assert
的断言。因此,无法保证断言在用户运行代码时确实会运行。这就是为什么如果不能保证会发生验证错误,那么承诺在API中抛出验证错误是不好的。因此,您允许用户使用无效参数调用您,而不会引发异常来警告他们。您应该改用运行时异常

那么,为什么可以在公共方法中使用它作为发布条件呢?

您引用的单据对前置和后置条件的定义如下:

前提条件-调用方法时必须为真的条件。 后置条件-方法完成后必须为真的条件 成功

您可以看到,前置条件取决于调用者,而后置条件取决于被调用者。如果满足了前置条件,post条件可能失败的唯一原因是方法中的代码有缺陷。这不是用户的错误,而是库本身的问题。我猜这就是为什么医生认为以禁用后条件断言结束问题较少的原因


我不确定我个人是否同意,因为如果不满足post条件,这可能意味着违反了该方法的合同,应该停止执行。取决于post条件的严重程度。API编写者可能希望在动态数组调整结束时检查某些比率是否对性能是最佳的,但如果不是这样,则不一定抛出异常,因为即使在次优比率下,程序仍会按预期运行。

您可以共享源代码吗?它就在这里的某个地方:尽管它说Java 7,这篇文章显然是旧的。另一种观点是:我在问为什么可以在公共方法中验证后条件,而不是先决条件。我仍然很困惑,我认为我的问题没有得到回答。@依赖于
assert
的Ogen断言可以被JVM标志禁用。因此,无法保证断言在用户运行代码时确实会运行。这就是为什么如果不能保证会发生验证错误,那么承诺在API中抛出验证错误是不好的。您应该使用运行时异常。好的,您的意思是断言不应该被用作公共方法中参数检查的替代,因为调用方可能关闭了断言-在这种情况下,断言检查将不会运行。如果是这样的话,为什么要使用断言来验证公共方法中的后置条件呢?为什么不在那里也使用标准的参数检查呢?@Ogen我不相信在文档中看到了这一点,但我并没有阅读所有内容。我认为断言不适合任何公共运行时检查。老实说,它们产生的错误不如异常好,所以我个人不会在任何情况下推荐它们context@Dici我知道这是一件固执己见的事情。但是oracle文档清楚地表明,您可以将assert用于公共后置条件和私有前置条件。我认为它们的用处超出了这个问题的范围。