Pytanie Znaczenie adnotacji @Flow


W Intellij IDEA 14 dostępna jest funkcja Automatycznego Wnioskowania o Kontrakt [1].

Co dokładnie oznacza przypisana adnotacja @Flow?

Na przykład dla kolekcji boolean addAll(Collection<? extends E> c)zakładana umowa jest boolean addAll(@NotNull @Flow Collection<? extends E> c).

Co robi @Flow znaczy w tym kontekście?

[1] http://blog.jetbrains.com/idea/2014/10/automatic-notnullnullablecontract-inference-in-intellij-idea-14/


14
2017-11-27 14:41


pochodzenie




Odpowiedzi:


Zastrzeżenie: Nie byłem w stanie znaleźć żadnych bardzo szczegółowych opisów lub przykładów tego, więc większość z tego to spekulacja.

Najlepsza dokumentacja, którą znalazłem @Flow do tej pory jest to, co można przeczytać w komentarzach do samej adnotacji, jak widać tutaj.

Fragment:

Ta adnotacja wspomaga funkcję "Przepływ danych do tego", opisując przepływ danych z parametru metody do odpowiedniego kontenera (np. ArrayList.add (element)) lub z kontenera do wartości zwracanej przez metodę (np. Set.toArray ()) lub między parametrami metody (np. System.arraycopy (tablica1, 0, tablica2, długość))

W skrócie, jest to forma metadanych. IntelliJ musi wykonać niektóre rodzaje analizy kodu, w jaki sposób dane wchodzą i wychodzą z kolekcji lub podobnej. Nie jestem pewien, jaki rodzaj analizy jest wykonywany, ale zakładam, że niektóre z inspekcji IntelliJ używają tego.

Spekuluję, że teoretycznie można byłoby przeprowadzić inspekcję podobną do poniższej, używając tych metadanych (jeśli jeszcze ich nie ma):

  • Według @Flow, dane przekazane do void push(Object) w końcu może zostać zwrócony Object pull()
  • Jeśli zwracana jest wartość z pull jest dereferencyjne bez sprawdzania null, daj ostrzeżenie, jeśli null jest zawsze przekazywane push.

Przed @Flow został dodany, prawdopodobnie musiał zostać zakodowany na stałe w IntelliJ i dlatego działałby tylko w standardowych klasach Javy, tablicach i innych (zakładając, że ten specyficzny typ analizy był wcześniej wykonywany). Dodawanie @Flow w ten sposób sprawiłoby, że byłaby bardziej elastyczna, a także umożliwiłaby analizę niestandardowych pojemników w ten sam sposób.

Jeśli ktoś ma więcej solidnych informacji na temat @Flow a niektóre przykłady z tego, jak są używane, również byłyby zainteresowane obejrzeniem tego.


13
2017-11-27 15:17





Aby rozszerzyć odpowiedź Smallhackera: Zakładam @Flow adnotacja jest używana w analizie statycznej, aby włączyć następujące ostrzeżenia:

1. Treści "listy" kolekcji są aktualizowane, ale nigdy nie są sprawdzane

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

2. Treści kolekcji 'queue' są wyszukiwane, ale nigdy nie są aktualizowane

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

Niestety, nie znalazłem żadnej dokumentacji, która by to poparła, i @Flow wydaje się być niedostępna w obu dodatkowo pobrane  org.jetbrains.annotations i org.intellij.lang.annotations pakiety mojej dystrybucji. Pojawia się jako podpowiedź podczas pisania argumentów metody, ale nie jest dostępna w kodzie źródłowym JDK.

Nawiasem mówiąc, adnotacja związana z przepływem danych jest @Contract.


2
2018-03-04 12:34