Wie Tzaman sagte, nutzt das Geheimnis schließlich; allgemein:
Resource r = allocateResource();
try {
// use resource
}
finally {
r.dispose();
}
Aktivitäten hier zu beachten:
- versuchen und schließlich einen variablen Umfang jeder erstellen. Die Zuweisung Ihrer Ressource innerhalb der try-Klausel funktioniert also nicht, da sie in der finally-Klausel nicht sichtbar ist. Sie müssen die Variable der Ressource vor der try-Anweisung deklarieren.
Wenn Sie mehrere Ressourcen zuweisen, gilt das allgemeine Muster sauber, aber das ist oft nicht ersichtlich, für Anfänger:
Resource1 r1 = allocateResource1();
try {
// code using r1, but which does not need r2
Resource r2 = allocateResource2();
try {
// code using r1 and r2
}
finally {
r2.dispose();
}
}
finally {
r1.dispose();
}
, und so weiter und so fort, wenn Sie mehr Ressourcen zuzuweisen . Wenn Sie ein paar von ihnen haben, werden Sie sicherlich versucht sein, zu vermeiden, tiefe Verschachtelung von versuchen ... endlich Aussagen. Nicht. Sie können Ressourcenfreigabe und Ausnahmebehandlung ohne Verschachtelung bekommen, so viele versuchen ... endlich Anweisungen, aber es richtig zu bekommen, ohne Verschachtelung versuchen ... schließlich ist noch hässlicher als tiefe Verschachtelung.
Wenn Sie häufig eine Reihe von Ressourcen nutzen, dann können Sie einen Funktor-basierte Methode implementieren, um die Wiederholung, so etwas wie zu vermeiden:
interface WithResources {
public void doStuff(Resource1 r1, Resource2 r2);
}
public static void doWithResources(WithResources withResources) {
Resource r1 = allocateResource1();
try {
Resource r2 = allocateResource2();
try {
withResources.doStuff(r1, r2);
}
finally {
r2.dispose();
}
}
finally {
r1.dispose();
}
}
die dann können Sie wie folgt verwenden:
doWithResources(new WithResources() {
public void doStuff(Resource1 r1, Resource2 r2) {
// code goes here
}
});
doWithResources wird die Zuordnung und Freigabe automatisch richtig handhaben, und Ihr Code wird weniger Wiederholungen haben (was eine gute Sache ist). Allerdings:
- Java-Syntax für anonyme Klassen übermäßig ausführliche
- Checked Ausnahmen innerhalb doStuff Dinge komplizieren zu viel
, zwei Punkte, die ich hoffe, dass in Java 7 gelöst werden.
Sie diese Art von Code im ganzen Frühling, zum Beispiel finden:
Ich weiß nicht viel über 'mit' oder Python für die Angelegenheit, aber wenn es so etwas wie C# '' using' ist, wurde dies kürzlich beantwortet: http://stackoverflow.com/questions/ 2943542/using-keyword-in-java –
+1 aber: '[const]' '[final]' existiert auch, also sollte '[with]' auch ein Tag haben. Ich kann es noch nicht schaffen. – n611x007