Java 如何为类编写不变量?

Mou*_*415 5 java javadoc invariants

我想知道评论的确切位置以及我应该使用什么关键字,因为我似乎真的无法在网上找到示例,例如我应该这样做吗?

/**
 * @invariant invariant example
 */
 public class Example {
 } 
Run Code Online (Sandbox Code Playgroud)

Bar*_*cki 4

有几种可能

@Contract注解

一些例子

  • @Contract("_, null -> null") - 如果第二个参数为 null,则方法返回 null。

  • @Contract("_, null -> null; _, !null -> !null") - 如果第二个参数为 null,则方法返回 null,否则返回 not-null。

  • @Contract("true ->fail") - 一个典型的assertFalse()方法,如果将true传递给它,它会抛出异常。

有关更多详细信息,请参阅https://www.jetbrains.com/help/idea/2016.2/contract-annotations.html 。

您可以在没有 IntelliJ IDEA 的情况下使用它们。IDEA 对这些注释提供了智能支持。它将检查您的方法代码是否确实满足指定的不变量。

文字描述

该方法并不能覆盖所有情况。对于字段之间更复杂的依赖关系,您需要使用英语单词来描述不变性。

例如,https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#put(K,%20V)

如果映射先前包含键的映射,则旧值将替换为指定值。

例外情况

此外,异常可用于描述和强制不变性。对于上述Map.put方法,我们有以下无效参数的例外(会破坏类不变性的参数)

  • 如果此映射不支持 put 操作,则@抛出 UnsupportedOperationException
    • 如果指定键或值的类阻止将其存储在此映射中,则@抛出 ClassCastException
    • 如果指定的键或值为空并且此映射不允许空键或值,则@抛出 NullPointerException
    • 如果指定键或值的某些属性阻止将其存储在此映射中,则@抛出 IllegalArgumentException