关于java:为什么番石榴没有后置条件? 我可以用什么呢?

Why doesn't Guava have postconditions? What can I use instead?

因此,Guava具有简单但有用的前置条件来检查方法参数。 但我想有一个"后置条件"类也是合理的。 或者只是因为java提供断言?

由于这样的类不存在,在mathod返回之前检查postonditions的"最佳"(练习)替代方法是什么?


测试后期条件将是多余的。
我们在java中测试后置条件的方法是通过单元测试。

通过单元测试,我们确保对于给定的输入我们获得可预测的输出。使用Preconditions,我们可以验证我们是否有有效的输入,因此测试已经保证了输出。


我会在方法本身中使用Java assert关键字来对后置条件进行编码。

单元测试还是后置条件?

单元测试和后置条件有不同的用途。

单元测试中的断言提供了对一个输入向量的方法结果的检查。它是一个oracle,指定了一个特定案例的预期结果。

方法本身中的assert验证后置条件保持的任何输入。它是一个oracle指定(属性)所有可能情况的预期结果。
这样的postcondition-as-oracle与自动化测试技术很好地结合,在这些技术中很容易生成输入,但很难为每个输入生成预期值。

番石榴后置条件?

至于为什么Guava有一个Precondition类,但没有Postcondition类,这是我的理解。

Guava Preconditions有效地为常见情况提供了许多简写,在这些情况下,您希望根据方法的输入或对象的状态抛出特定类型的异常(非法参数,空指针,索引越界,非法状态)。

对于后置条件,这类常见案例较少。因此,不需要提供速记抛出特定种类的例外。失败的后置条件就像HTTP 500"内部服务器错误" - 我们知道执行我们的方法时出错了。

(请注意,Guava的前提条件概念与纯合同设计的概念完全不同,在合同设计中,如果不满足前提条件则根本没有保证 - 甚至不会抛出合理的异常.Guava的Preconditions类提供了有用的功能。使公共API更具防御性的能力)。


先决条件和后置条件有着截然不同的目的。

前提条件测试输入,不受方法控制; postconditions测试输出,即。因此,它们在方法本身内部没有任何意义,但仅作为测试方法的外部代码。

但是,如果你真的想在你的代码中加入这样的断言,那么Guava Preconditions也可以很好地服务于它,即使这不是它们的预期目的。