2016-01-13 3 views
10

Sto utilizzando Java 8 streams al posto di molti vecchi style per i loop per scorrere un gruppo di risultati e produrre statistiche di riepilogo. Per esempio:Quando un IntStream è effettivamente chiuso? SonarQube S2095 è un falso positivo per IntStream?

int messages = IntStream.rangeClosed(0, 7).map(ids::get).reduce(Integer::sum).getAsInt(); 

Nota: So che ci sono altri modi per fare il conteggio che vi mostro qui sopra. Lo sto facendo in questo modo per illustrare la mia domanda.

Sto utilizzando SonarQube 5.3 con il plugin Java 3.9. In questa configurazione, la riga di codice precedente mi dà una violazione della regola calamaro S2095: "Le risorse dovrebbero essere chiuse". Questo è il risultato che mi aspetterei di vedere se un AutoCloseable (ad esempio, un FileInputStream) è stato aperto ma non è mai stato chiuso.

Quindi, ecco la mia domanda: l'operazione del terminale reduce chiude lo stream? Dovrebbe? O è un falso positivo nella regola del calamaro?

+0

'' '' IntStream'' ha '' 'onClose (Runnable closeHandler)' '' metodo ereditato dalla classe '' 'BaseStream'''. Puoi esaminare quando lo stream è chiuso o non chiuso usando questo gestore. – saka1029

+0

Monitor https://jira.sonarsource.com/browse/SONARJAVA-1478 – PaoloC

risposta

8

Non è chiuso, perché l'interfaccia AutoCloseable funziona solo all'interno di try-with-resources. Ma questa operazione di chiusura è del tutto inutile per IntStream come si legge in AutoCloseable interfaccia javadoc:

Tuttavia, quando si utilizzano servizi quali java.util.stream.Stream che supporto sia di I/O-based e non-io/I moduli basati su O, try-with-resources I blocchi non sono in genere necessari quando si utilizzano moduli non basati su I/O.

Così S2095 è un falso positivo per IntStream. Quello sarà riparato speranzoso da SONARJAVA-1478

+0

Quindi le mie domande su quando lo streaming è effettivamente chiuso rimangono valide. Stai dicendo che questo è un falso positivo nella regola del calamaro? O stai dicendo che l'intero punto è discutibile? –

+3

@BobCross Questo è davvero un falso positivo. L'interfaccia 'AutoClosable' è cambiata in Java 8 e ora qualcosa che è' AutoClosable' potrebbe non contenere una risorsa da chiudere. – Tunaki

+5

L'analisi statica non rileva i bug; rileva le cose che potrebbero essere bug e potrebbe valerne la pena. In questo caso, l'hai guardato e determinato che non è un bug, perché il flusso non contiene risorse che necessitano di rilascio. –