2013-08-01 8 views
8

Oft habe ich die Anweisung getroffen, dass die Anwendung immer alle geöffneten Ressourcen explizit schließen sollte.Ist das Schließen der Ressourcen immer wichtig?

Meine Herangehensweise an die Programmierung ist eher pragmatisch und ich mag es nicht, blind irgendeiner Konvention zu folgen, von der ich nicht eindeutig Vorteile sehe. Daher meine Frage.

Lassen Sie uns davon ausgehen, dass:

  1. Ich habe eine kleine Anwendung
  2. Es kann einige Ressourcen öffnet (zB Dateien, Datenbankverbindungen, Remote-Streams) und verarbeitet sie
  3. Es kann einige Minuten funktioniert und dann es verlässt
  4. Lassen sie uns sagen, es ist in Java
  5. (wenn die Sprache relevant ist)

muss ich wirklich über cl haben zu kümmern alle Ressourcen, die ich geöffnet habe? Ich denke, alle Ressourcen, die ich geöffnet habe, werden geschlossen/freigegeben, wenn die Anwendung/virtuelle Maschine beendet wird. Habe ich recht?

Wenn das stimmt, gibt es irgendwelche überzeugenden Gründe, sich darum zu kümmern, Ressourcen in einer so kleinen, kurzen Arbeitsanwendung zu schließen?

UPDATE:

Die Frage ist rein hypothetisch, aber das Argument für nicht darüber Sorge ist, dass ich nur ein paar schnellen Skript Hacking kann zusammen und will keinen unnötigen Code schreiben, die nicht direkt mit das Problem auf der Hand: Schließen Ressourcen, all diese ausführliche try-catch-finally Sachen zu tun, Umgang mit Ausnahmen, die ich über usw. ist

der Punkt der Frage ist es egal, ob es irgendwelche praktische Folgen tu es nicht.

+5

Lassen Sie mich mit einer Frage an Sie antworten: Warum sollten Sie sich nicht darum kümmern, die Ressourcen zu schließen? –

+1

"rate, dass alle Ressourcen, die ich geöffnet habe, geschlossen/freigegeben werden, wenn die Anwendung/virtuelle Maschine beendet wird." -> Meine Vermutung ist, dass das nicht stimmt. Wenn Sie nicht schließen und VM beendet wird, kann das Betriebssystem dafür verantwortlich sein, diese Streams/Sockets zu schließen. – kosa

+3

Um die Warnungen loszuwerden, müssten Sie sie unterdrücken, was genauso viel Arbeit ist wie .close(). Auch ist es eine gute Form. –

Antwort

9

Ich denke, alle Ressourcen, die ich geöffnet habe, werden geschlossen/freigegeben, wenn die Anwendung/virtuelle Maschine beendet wird.

Was mit einer Ressource passiert, die nicht regelmäßig freigegeben wurde, liegt außerhalb Ihrer Kontrolle. Es kann nicht schaden, oder es kann etwas tun. Es ist auch sehr plattformabhängig, so dass das Testen auf nur einem nicht helfen wird.

Warum sollte ich mich darum kümmern, diese Ressourcen in einer so kleinen, kurzen Arbeitsanwendung zu schließen?

Die Größe der Anwendung sollte keine Rolle spielen. Erstens wachsen Anwendungen normalerweise; Zweitens, wenn Sie nicht üben, es richtig zu machen, werden Sie nicht wissen, wie man es macht, wenn es darauf ankommt.

+1

Ressourcen schließen erfordert viel Übung, da es [wirklich schwierig] ist (http://illegalarumententexception.blogspot.de/2008/10/java-how-not-to-make-of-stream.html) – zapl

+0

@ zapl Danke für den tollen Link! –

2

Kurze Antwort - Ja. Zum einen ist es eine schreckliche Kodierungspraxis, wie es in jedem anderen Bereich des Lebens ist, um nicht nach dir selbst aufzuräumen. Zum anderen können Sie nicht vorhersagen, ob das Betriebssystem erkennt, dass die Java-Umgebung die Ressourcen nicht mehr benötigt, und dass Sie möglicherweise Sperren für Dateien/etc erhalten, die ohne einen erzwungenen Neustart nicht freigegeben werden können.

Bereinigen Sie immer alle Ressourcen, die Sie öffnen!

Update in Bezug auf Ihr Update auf die ursprüngliche Frage - es dauert 5 Sekunden, um einen try/catch-Block zum Schließen offener Ressourcen hinzuzufügen, und kann verhindern, dass Sie 5 Minuten den Computer neu starten müssen. Wenn Sie es richtig machen, sparen Sie am Ende immer Zeit. Mein Vater hat mir immer gesagt, dass die wahre faule Person beim ersten Mal alles richtig macht, damit sie nicht wiederkommen und es wieder tun müssen. Ich sage nur, sei nicht faul und mach es richtig. Die 5 Sekunden, die man braucht, um einen Catch-Block zu schreiben, werden den Schreibprozess nie erheblich verlangsamen ... die 5 Sekunden, die du speicherst, indem du sie nicht schreibst, könnten dein Debugging immens verlangsamen.

+1

"genauso wie es in jedem anderen Bereich des Lebens ist, nicht nach sich selbst aufzuräumen", sagte er. –

+2

Danke, du hast ein paar gute Punkte gemacht. Es ist nicht wirklich so, dass ich so faul bin. Ich schließe Ressourcen in meinem Code. Es ist einfach so, dass ich Axiome und Dinge nicht mag, "weil jeder es macht". Deshalb habe ich bewusst solche kontroverse Frage formuliert. Und es sind nicht nur diese 5 Sekunden, die ich erwähnt habe, die ich nicht mag, sondern der ausführliche und eher hässliche Code, der in Java benötigt wird. Wir müssen definitiv zu Java7 wechseln, das Try-with-Resources einführt. –

+0

Ich habe noch nicht mit der neuen "try with resources" -Funktion in Java 7 gespielt, aber da stimme ich dir zu :) – StormeHawke

5

Wenn Sie die Ressourcen nicht schließen, führt, dass Mai zu Anwendungsservern, wenn Ressourcenerschöpfungs occurs.because Betriebssysteme häufig neu gestartet werden und Server Anwendungen haben in der Regel eine obere gebundene Grenze für Ressourcen

Nach docs

Die typische Java-Anwendung manipuliert mehrere Arten von Ressourcen wie Dateien, Streams, Sockets und Datenbankverbindungen. Solche Ressourcen müssen mit großer Sorgfalt behandelt werden, da sie Systemressourcen für th erwerben Eir Operationen.So müssen Sie sicherstellen, dass sie auch im Falle von Fehlern befreit werden.

der Tat ist eine falsche Ressourcenmanagement eine gemeinsame Quelle von Fehlern in Produktionsanwendungen mit den üblichen Fallen Datenbankverbindungen sind und Dateideskriptoren geöffnet bleibt, nachdem eine Ausnahme irgendwo aufgetreten ist sonst in Dies führt dazu, dass Anwendungsserver häufig neu gestartet werden, wenn Ressourcen erschöpft sind, da Betriebssysteme und Server Anwendungen im Allgemeinen eine Obergrenze für Ressourcen haben.

try-with-resources Statement in Java 7 für die Programmierer eingeführt, die nahe Aussagen hasst.

+1

+1 Guter Tipp über 'try-with-resources'. Da ich im dunklen Zeitalter von Java 5 feststeckte, war ich mir seiner Existenz nicht bewusst. – splungebob

Verwandte Themen