【问题标题】:Java: Design by Contract annotationsJava:契约式设计注解
【发布时间】:2015-02-16 11:30:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: java design-by-contract


    【解决方案1】:

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

    但是,您可以使用不同的工具,例如可以访问注释的 JMSAssert。更多详情:http://www.mmsindia.com/JMSAssert.html

    【讨论】:

    • 来自 JMSAssert 网页:“JMSAssert 目前仅在 Windows 平台上可用。支持的 JDK 版本:1.2.0 到 1.3.1。”
    【解决方案2】:

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

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

    问候

    【讨论】:

    • 啊,好吧,那么它只作为开发人员的文档存在?
    • @jbailie1991是的,据我所知
    【解决方案3】:

    规范(例如按合同设计的注释)记录了您的代码应该如何表现。这作为文档很有用,因此您可以在代码中找到错误,并且代码的客户端可以正确使用它。

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多