Java @Flow注释的含义
在Intellij IDEA 14中,有一个功能称为自动契约推理[1] 推断出的@Flow注释到底意味着什么Java @Flow注释的含义,java,intellij-idea,contract,inference,Java,Intellij Idea,Contract,Inference,在Intellij IDEA 14中,有一个功能称为自动契约推理[1] 推断出的@Flow注释到底意味着什么 例如,对于集合的boolean addAll(集合免责声明):我还没有找到任何关于这方面的详细描述或示例,所以大部分都是推测 到目前为止,我为@Flow找到的最好的文档是可以从注释本身的注释中读取的内容,正如大家所看到的 摘录: 此注释通过描述从方法参数到相应容器(例如ArrayList.add(item))或从容器到方法返回值(例如Set.toArray())或方法参数之间(例如Sys
例如,对于集合的
boolean addAll(集合免责声明):我还没有找到任何关于这方面的详细描述或示例,所以大部分都是推测
到目前为止,我为@Flow
找到的最好的文档是可以从注释本身的注释中读取的内容,正如大家所看到的
摘录:
此注释通过描述从方法参数到相应容器(例如ArrayList.add(item))或从容器到方法返回值(例如Set.toArray())或方法参数之间(例如System.arraycopy(array1,0,array2,length))的数据流,来协助“数据流到此”功能
简而言之,这是一种元数据形式IntelliJ需要对数据如何进入和退出集合或类似对象进行一些类型的代码分析。不确定使用它进行的是哪种类型的分析,但我假设IntelliJ的一些检查使用它
我推测,理论上可以使用此元数据进行类似于以下内容的检查(如果尚未存在):
- 根据
@Flow
,传递到void push(Object)
的数据最终可以从Object pull()返回
- 如果在未检查
null
的情况下取消对pull
返回值的引用,如果null
被传递到push
中,则发出警告
在添加@Flow
之前,这可能必须硬编码到IntelliJ中,因此只适用于Java的标准容器类、数组和其他东西(假设之前已经完成了这种特定类型的分析)。添加@Flow
将使其更加灵活,并允许以相同的方式分析自定义容器
如果有人有关于@Flow
的更可靠的信息,以及它如何使用的一些真实示例,我也很想看看。扩展Smallhacker的回答:我假设@Flow
注释用于静态分析,以启用以下警告:
1.集合“列表”的内容已更新,但从未查询过
List List=new ArrayList();
增加(3);
2.已查询集合“队列”的内容,但从未更新
Queue Queue=new PriorityQueue();
整数i=queue.peek();
不幸的是,我没有找到任何文档来支持这一点,而且@Flow
似乎在我的发行版的org.jetbrains.annotations
和org.intellij.lang.annotations
包中都不可用。它在编写方法参数时作为提示出现,但在JDK的源代码中不可用
顺便说一下,与数据流相关的注释是
List<Integer> list = new ArrayList<>();
list.add(3);
Queue<Integer> queue = new PriorityQueue<>();
Integer i = queue.peek();