@Flow注释的含义

时间:2014-11-27 14:41:36

标签: java intellij-idea contract inference

在Intellij IDEA 14中,有一项称为自动合同推理的功能[1]。

推断的@Flow注释究竟是什么意思?

例如,对于Collection boolean addAll(Collection<? extends E> c),推断的合同是 boolean addAll(@NotNull @Flow Collection<? extends E> c)

@Flow在这种情况下的含义是什么?

[1] http://blog.jetbrains.com/idea/2014/10/automatic-notnullnullablecontract-inference-in-intellij-idea-14/

2 个答案:

答案 0 :(得分:14)

免责声明:我还没有找到任何大量详细的描述或示例,所以大部分内容都是猜测。

到目前为止,我@Flow找到的最佳文档是人们可以在注释本身的注释中阅读的内容,正如人们可以看到here

摘录:

  

这个注释有助于“数据流”到这个&#39;通过描述从方法参数到相应容器的数据流(例如ArrayList.add(item))或从容器到方法返回值(例如Set.toArray())或方法参数(例如System.arraycopy(array1) ,0,array2,length))

简而言之,它是元数据的一种形式IntelliJ需要对数据如何进入和退出集合或类似物进行某些类型的代码分析。不确定使用它做了什么类型的分析,但我假设IntelliJ的一些检查使用它。

我推测理论上可以使用这个元数据进行类似于以下的检查(如果它不存在):

  • 根据@Flow,传递给void push(Object)的数据最终可以从Object pull()
  • 返回
  • 如果在不检查pull的情况下取消引用null的返回值,请在null传递push后发出警告。

在添加@Flow之前,这可能必须硬编码到IntelliJ中,因此只适用于Java的标准容器类,数组和内容(假设此类特定类型的分析之前已经完成) 。因此,添加@Flow会使其更加灵活,并允许以相同的方式分析自定义容器。

如果有人有关于@Flow的更多可靠信息以及一些关于它如何使用的现实世界的例子,我也有兴趣看到它。

答案 1 :(得分:2)

扩展Smallhacker的答案:我假设在静态分析中使用@Flow注释来启用以下警告:

1。 集合'list'的内容已更新,但从未查询

List<Integer> list = new ArrayList<>();
list.add(3);

2。 查询集合'队列'的内容,但从未更新

Queue<Integer> queue = new PriorityQueue<>();
Integer i = queue.peek();

很遗憾,我没有找到任何支持此问题的文档,@Flow似乎在我的发行版的additionally downloaded org.jetbrains.annotationsorg.intellij.lang.annotations个包中都不可用。它在编写方法的参数时显示为提示,但在JDK的源代码中不可用。

顺便说一下,与数据流相关的注释是@Contract