注释@Flow的含义
在Intellij IDEA 14中,有一个名为自动合同推理[1]的功能。
推断的@Flow注释到底是什么意思?
例如,对于集合,推断的合约是 。boolean addAll(Collection<? extends E> c)
boolean addAll(@NotNull @Flow Collection<? extends E> c)
在这种情况下意味着什么?@Flow
在Intellij IDEA 14中,有一个名为自动合同推理[1]的功能。
推断的@Flow注释到底是什么意思?
例如,对于集合,推断的合约是 。boolean addAll(Collection<? extends E> c)
boolean addAll(@NotNull @Flow Collection<? extends E> c)
在这种情况下意味着什么?@Flow
免责声明:我无法找到任何详细描述或示例,因此其中大部分都是推测。
到目前为止,我找到的最好的文档是在注释本身的评论中可以阅读的内容,正如人们在这里看到的那样。@Flow
摘录:
此注释通过描述从方法参数到相应容器(例如ArrayList.add(item))或从容器到方法返回值(例如Set.toArray())或方法参数之间的数据流(例如System.arraycopy(array1,0,array2,length))来帮助“数据流到此”功能
简而言之,它是一种元数据形式,IntelliJ需要对数据如何进入和退出集合或类似集合进行某些类型的代码分析。不确定使用这个进行哪种类型的分析,但我假设IntelliJ的一些检查利用了它。
我推测,理论上可以使用此元数据进行类似于以下内容的检查(如果它尚不存在):
@Flow
void push(Object)
Object pull()
pull
null
null
push
在添加之前,这大概必须硬编码到IntelliJ中,因此仅适用于Java的标准容器类,数组和东西(假设这种特定类型的分析甚至在此之前完成)。因此,添加将使其更加灵活,并且还允许以相同的方式分析自定义容器。@Flow
@Flow
如果有人有更多关于它如何使用的可靠信息和一些现实世界的例子,我也会有兴趣看到它。@Flow
为了扩展Smallhacker的答案:我假设在静态分析中使用了注释,以启用以下警告:@Flow
1. 集合“列表”的内容已更新,但从未查询过
List<Integer> list = new ArrayList<>();
list.add(3);
2. 查询收集“队列”的内容,但从不更新
Queue<Integer> queue = new PriorityQueue<>();
Integer i = queue.peek();
不幸的是,我没有找到任何支持它的文档,并且似乎在我的发行版的额外下载和软件包中都不可用。它在编写方法的参数时显示为提示,但在 JDK 的源代码中不可用。@Flow
org.jetbrains.annotations
org.intellij.lang.annotations
顺便说一句,与数据流相关的注释@Contract
。