在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/
免责声明:我未能找到任何大量详细的描述或示例,因此大多数是猜测.
@Flow
到目前为止,我找到的最好的文档是人们可以在注释本身的注释中阅读的内容,正如人们可以在这里看到的那样.
摘抄:
此注释通过描述从方法参数到相应容器(例如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
如何使用的可靠信息和一些现实世界的例子,我也有兴趣看到它.