Java:契约式设计注释
我最近开始阅读合同设计方法,但我不了解其中的一些方面。在javadoc风格的注释中使用@pre etc时,这些标记除了用作文档之外还有什么用途?编译器在执行之前是否使用这些检查参数,或者这些只是指示方法中应该进行何种检查的指标?e、 g.如果我有一个获取方法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; } 这是否会导致在运
/**
* @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。”