Java:契约式设计注释

Java:契约式设计注释,java,design-by-contract,Java,Design By Contract,我最近开始阅读合同设计方法,但我不了解其中的一些方面。在javadoc风格的注释中使用@pre etc时,这些标记除了用作文档之外还有什么用途?编译器在执行之前是否使用这些检查参数,或者这些只是指示方法中应该进行何种检查的指标?e、 g.如果我有一个获取方法 /** * @pre age >= 0 #CustomAgeException */ public int getAge() throws CustomAgeException{ return age; } 这是否会导致在运

我最近开始阅读合同设计方法,但我不了解其中的一些方面。在javadoc风格的注释中使用@pre etc时,这些标记除了用作文档之外还有什么用途?编译器在执行之前是否使用这些检查参数,或者这些只是指示方法中应该进行何种检查的指标?e、 g.如果我有一个获取方法

/**
* @pre age >= 0 #CustomAgeException
*/
public int getAge() throws CustomAgeException{
    return age;
}

这是否会导致在运行该方法之前在运行时进行检查,编译器是否对此进行检查,或者这是否只是向开发人员声明,在调用该方法之前,年龄必须等于或大于0,并且应在getAge中执行检查?

JavaDoc在运行时不可访问。
.class
文件不包含它们。因此,任何检查javadoc的代码都是不可能的

注释只是为了创建漂亮的javadoc,或者在类之间为这些注释保留相同的模式。 您必须自己实现检查,或者使用某种框架来实际执行检查。(可能在方法/参数级别具有真实注释)


Java不直接支持契约式设计。正如Robin Jonsson所说,JavaDoc在运行时是不可访问的


但是,您可以使用不同的工具,例如JMSAssert,它可以访问注释。有关更多详细信息:

规范,如契约式设计注释,请记录代码的行为方式。这是很有用的文档,这样您就可以在代码中找到bug,并且代码的客户端可以正确地使用它

最好是对文档进行机器检查,这样您就可以保证代码没有bug,并且客户端正确地使用它。运行时断言可以帮助实现这一点,但它们不能保证:它们可能在运行时失败


编译器最好在执行之前检查规范,正如您在问题中所问的那样。(不幸的是,其他答案忽略了问题的这一部分,只关注运行时检查。)有各种各样的框架可以对规范进行编译时检查。因为这个问题通常是无法确定的,所以所有的框架都有局限性,但是您可能会发现它们很有用。一个很好的选项是,它允许您定义类型注释,例如@NonNegative,将它们写入代码中,编译器将验证您的代码是否与注释一致。

ah ok,那么它仅作为开发人员的文档存在吗?@jbailie1991Yes,据我在JMSAssert网页上看到的:“JMSAssert目前仅在Windows平台上可用。支持的JDK版本:1.2.0到1.3.1。”