2014-11-27 21 views
14

In Intellij IDEA 14 è presente una funzione denominata Inferenza contratto automatico [1].Significato dell'annotazione @Flow

Che cosa significa esattamente l'annotazione @Flow dedotta?

Ad esempio per Collection boolean addAll(Collection<? extends E> c) il contratto derivato è boolean addAll(@NotNull @Flow Collection<? extends E> c).

Cosa significa "@Flow" in questo contesto?

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

risposta

12

Disclaimer: non sono stato in grado di trovare le descrizioni dettagliate in maniera massiccia o esempi di questo, quindi la maggior parte di questo è la speculazione.

La migliore documentazione che ho trovato per @Flow finora è ciò che si può leggere nei commenti sull'annotazione stessa, come si può vedere here.

Estratto:

Questa annotazione aiuta il 'flusso di dati a questa' caratteristica descrivendo flusso di dati dal parametro metodo alla corrispondente contenitore (es ArrayList.add (voce)) o dal contenitore al valore restituito metodo (es Set.toArray()) o tra parametri di metodo (es System.arraycopy (array1, 0, array2, lunghezza))

In poche parole, è una forma di metadati IntelliJ deve fare qualche tipi di analisi del codice su come i dati entrano ed escono da una raccolta o simili. Non sono sicuro di quale tipo di analisi venga eseguita utilizzando questo, ma presumo che alcune delle ispezioni di IntelliJ ne facciano uso.

ho ipotizzano che un controllo simile al seguente potrebbe teoricamente essere effettuato utilizzando questi metadati (se non esiste già):

  • Secondo @Flow, dati passati al void push(Object) possono eventualmente essere restituiti da Object pull()
  • Se il valore di ritorno da pull viene trasferito senza controllo per null, dare un avviso se null è mai passato a push.

Prima @Flow è stato aggiunto, questo doveva presumibilmente essere insita nel IntelliJ e sarebbe quindi funziona solo per contenitore standard classi, gli array e la roba di Java (supponendo che questo specifico tipo di analisi è stato ancora fatto prima). L'aggiunta di @Flow lo renderebbe quindi più flessibile e consentirà anche di analizzare i contenitori personalizzati allo stesso modo.

Se qualcuno ha informazioni più precise su @Flow e alcuni esempi reali di come viene utilizzato, anch'io sarei interessato a vederlo.

1

Per estendere sulla risposta Smallhacker: Presumo che l'annotazione @Flow viene utilizzato in analisi statica per abilitare le seguenti avvertenze:

1.Contenuto della collezione 'lista' vengono aggiornati, ma mai interrogati

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

2. Contenuto della collezione 'coda' vengono interrogati, ma mai aggiornate

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

Purtroppo, non ho trovato tutta la documentazione che lo supporta e @Flow sembra non essere disponibile in entrambi i pacchetti additionally downloadedorg.jetbrains.annotations e org.intellij.lang.annotations della mia distribuzione. Appare come un suggerimento durante la scrittura degli argomenti di un metodo, ma non è disponibile nel codice sorgente del JDK.

A proposito, un'annotazione relativa al flusso di dati è @Contract.