在Intellij IDEA 14中,有一项称为自动合同推理的功能[1]。
推断的@Flow注释究竟是什么意思?
例如,对于Collection boolean addAll(Collection<? extends E> c)
,推断的合同是
boolean addAll(@NotNull @Flow Collection<? extends E> c)
。
@Flow
在这种情况下的含义是什么?
答案 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.annotations
和org.intellij.lang.annotations
个包中都不可用。它在编写方法的参数时显示为提示,但在JDK的源代码中不可用。
顺便说一下,与数据流相关的注释是@Contract
。