Значение @Flow аннотации

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

Ответы

Ответ 1

Отказ от ответственности: я не смог найти массовое подробное описание или примеры этого, поэтому большинство из них - это спекуляция.

Лучшая документация, которую я нашел для @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 и, таким образом, работало бы только для стандартных классов контейнеров, массивов и т.д. (предполагая, что этот конкретный тип анализа был выполнен раньше). Таким образом, добавление @Flow сделает его более гибким, а также позволит анализировать отдельные контейнеры таким же образом.

Если у кого-то есть более достоверная информация о @Flow и некоторых реальных примерах того, как он используется, мне тоже было бы интересно увидеть его.

Ответ 2

Чтобы продлить ответ Smallhacker: я предполагаю, что аннотация @Flow используется в статическом анализе, чтобы включить следующие предупреждения:

1. Содержимое коллекции "список" обновляется, но никогда не запрашивается

List<Integer> list = new ArrayList<>();
list.add(3);

2. Содержимое коллекции "queue" запрашивается, но никогда не обновляется

Queue<Integer> queue = new PriorityQueue<>();
Integer i = queue.peek();

К сожалению, я не нашел никакой документации, подтверждающей это, и @Flow кажется недоступным как в дополнительно скачан org.jetbrains.annotations, так и org.intellij.lang.annotations пакетов моего дистрибутива. Он отображается как подсказка при написании аргументов метода, но недоступен в исходном коде JDK.

Кстати, аннотация, связанная с потоком данных, @Contract.