@Flow注释的含义

luk*_*tei 15 java inference intellij-idea contract

在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/

Sma*_*ker 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如何使用的可靠信息和一些现实世界的例子,我也有兴趣看到它.