Java:按合同注释设计

时间:2015-02-16 11:30:07

标签: java design-by-contract

我最近开始阅读契约式设计方法,但我不了解它的某些方面。在javadoc样式注释中使用@pre等时,除了文档之外,这些标记的用途是什么?编译器是否在执行前使用这些参数检查参数,或者这些只是指示方法中应该进行哪种检查的指标?例如如果我有一个getAge方法;

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

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

3 个答案:

答案 0 :(得分:3)

Java不直接支持按合同设计。正如Robin Jonsson所说,JavaDoc在运行时无法访问。

但是,您可以使用不同的工具,例如可以访问注释的JMSAssert。有关详细信息:http://www.mmsindia.com/JMSAssert.html

答案 1 :(得分:2)

JavaDoc在运行时无法访问。 .class文件不包含它们。 (参考这里StackOverflow question)因此,任何检查javadoc的代码都是不可能的。

评论只是为了制作漂亮的javadoc,或者为这些类的笔记保持相同的模式。 您必须自己实施检查,或使用某种框架来实际执行检查。 (也许在方法/参数级别上有实际注释)

此致

答案 2 :(得分:2)

规范(例如按合同设计注释)记录了代码的行为方式。这对于文档非常有用,因此您可以在代码中找到错误,代码的客户端也可以正确使用它。

使用机器检查文档甚至更好,这样可以保证您的代码没有错误,并且客户端正确使用它。运行时断言可以帮助解决这个问题,但是它们不能保证:它们可能在运行时失败。

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