Come disse lo tzaman, il segreto sta usando finalmente; in generale:
Resource r = allocateResource();
try {
// use resource
}
finally {
r.dispose();
}
cose da notare qui:
- prova e, infine, creare un ambito di ciascuna variabile. Quindi allocare la tua risorsa all'interno della clausola try non funzionerà, in quanto non sarà visibile nella clausola finally- devi dichiarare la variabile della risorsa prima dell'istruzione try.
Se si dispone di diverse risorse da allocare, lo schema generale si applica in modo pulito, ma questo spesso non è evidente per i principianti:
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();
}
, e così via e così via, se si dispone di più risorse per allocare . Se ne hai un paio, sarai sicuramente tentato di cercare di evitare il nidificazione profonda delle affermazioni try ... finally. Non farlo. È possibile ottenere la deallocazione delle risorse e la gestione delle eccezioni a destra senza nidificare così tante provate ... finalmente le affermazioni, ma facendolo correttamente senza provare il nidificazione ... finalmente è ancora più brutto del nidificazione profonda.
Se avete spesso bisogno di utilizzare un insieme di risorse, è possibile implementare un metodo funtore-based per evitare la ripetizione, qualcosa come:
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();
}
}
Che poi si può usare in questo modo:
doWithResources(new WithResources() {
public void doStuff(Resource1 r1, Resource2 r2) {
// code goes here
}
});
doWithResources gestirà automaticamente l'allocazione e la deallocazione correttamente e il codice avrà meno ripetizioni (che è una buona cosa). Tuttavia:
- la sintassi di Java per le classi anonime è eccessivamente verbose
- eccezioni verificata entro doStuff complicare troppo le cose
, due punti che mi auguro possa essere risolto in Java 7.
È possibile trovare questo tipo di codice durante primavera, per esempio:
Non conosco molto bene 'with' o Python, ma se è qualcosa di simile a' uso di C#, questo è stato risolto molto recentemente: http://stackoverflow.com/questions/ 2943542/using-keyword-in-java –
+1 ma: '[const]' '[final]' esiste anche, quindi '[with]' dovrebbe avere anche un tag. Non riesco ancora a crearlo. – n611x007