2017-03-21 12 views
6

in Eclipse Neon, wenn ich dieses Java-Code schreiben:Warum zeigt Eclipse keine Leckwarnung für Streams?

Stream<Object> stream = Stream.builder().build(); 

ich keine undichte Stelle Warnungen bekommen, aber wenn ich Stream, wie

public class MyStream<T> implements Stream<T> { 
    // implementation 
} 

implementieren und ich schreibe einen ähnlichen Code

Stream<Object> stream = new MyStream<>(); 

Ich bekomme eine Resource leak: 'stream' is never closed Warnung. Dies geschieht nur in Eclipse, während das Kompilieren mit javac keine Warnung auslöst.

Hinweis Ich bin nicht auf der Suche nach einer Antwort zum Schließen des Streams und so, aber für eine Antwort, die den Grund für dieses unterschiedliche Verhalten für die gleiche Schnittstelle erklärt.

Antwort

3

Im ersten Fall erstellen Sie nicht die Instanz der Ressource. Im zweiten Fall bist du es.

Die eclipse documentation states the following:

Eigentümer/Verantwortung
Die oben genannte Diagnose grundsätzlich davon aus, dass eine Methode, die eine Instanz eines Ressourcentypen schafft auch für das Schließen dieser Ressource verantwortlich ist. [...]
- Wenn eine Methode eine Ressource über einen Methodenaufruf und nicht über einen neuen Ausdruck erhält, ist sie möglicherweise dafür verantwortlich oder nicht; Alle Probleme sind nur als potenzielle Ressourcenlecks gekennzeichnet.

4

Eclipse verfügt über eine Whitelist von Typen, die keine Bereinigung erfordern, da sie sich nicht auf Systemressourcen beziehen. Core-Java-Typen sind hier aufgelistet, aber Ihre benutzerdefinierten Typen nicht. Weitere Informationen finden Sie unter the help.

Verwandte Themen