2008-09-12 8 views
6

En C++, nous acquérons une ressource dans un constructeur et la libérons dans un destructeur. Ainsi, lorsqu'une exception survient au milieu d'une fonction, il n'y aura pas de fuite de ressources ou de mutex verrouillés ou quoi que ce soit d'autre.Gestion des ressources indolore dans Java

AFAIK java classes n'ont pas de destructeurs. Alors, comment fait-on la gestion des ressources en Java.

Par exemple:

public int foo() {  
    Resource f = new Resource(); 
    DoSomething(f); 
    f.Release(); 
} 

Comment une ressource de libération si DoSomething jette une exception? Nous ne pouvons pas mettre des blocs try \ catch partout dans le code, n'est-ce pas?

Répondre

4

Oui vous pouvez et devriez mettre try/catch/finally autour de votre code. En C# il y a un raccourci « en utilisant » déclaration, mais en Java vous êtes coincé avec:

public int foo() { 
    Resource f = new Resource(); 
    try { 
     DoSomething(f); 
    } 
    finally { 
     f.Release(); 
    } 
} 
0

Si vous voulez que l'utilisation de bloc s'impliquer dans le débat sur la fermeture de java: S

+0

où est ce débat? – Spoike

+0

Sur Internet: http://www.google.dk/search?q=java+closures – svrist

-1

Désolé de vous décevoir, mais en Java nous faire utiliser try \ catch \ enfin bloque beaucoup. Et avec "beaucoup", je veux dire A LOT. Je souhaite parfois que Java ait le bloc utilisant C#. La plupart du temps, vous n'aurez pas besoin de libérer des ressources car le garbage collector de Java s'en chargera. Cependant, les exceptions ont leur utilité pour rendre la gestion des erreurs beaucoup plus propre. Vous pouvez écrire vos propres exceptions et les attraper pour tout ce que vous faites. Plus de retour de codes d'erreur arbitraires à l'utilisateur!

+1

Oui! Commençons à leur retourner les traces de pile confuses laid pour eux! –

+0

Ah les merveilles d'obtenir une exception NullPointerException plutôt qu'une boîte de dialogue de code d'erreur -429321313. Rend moi fier d'être un développeur :) –

+1

Java 7 aura "gestion des ressources", une fonctionnalité qui fermera toutes les ressources 'Closeable' quand on utilise une forme spéciale de bloc' try'. –

3

Il est possible de factoriser try/finally (et les exceptions et les algorithmes) en utilisant Execute around idiom. Cependant, la syntaxe est très verbeuse.

public int foo() { 
    withResource(new WithResource() { public void run(Resource resource) { 
     doSomething(resource); 
    }}); 
} 

... 

public interface WithResource { 
    void run(Resource resource); 
} 

public static void withResource(WithResource handler) { 
    Resource resource = new Resource(); 
    try { 
     handler.run(resource); 
    } finally { 
     resource.release(); 
    } 
} 

Ce genre de chose a plus de sens si vous faites abstraction de plus de try/finally. Par exemple, avec JDBC, vous pouvez exécuter une instruction, parcourir les résultats, fermer les ressources et encapsuler l'exception.

+0

avec (new Resource() {public void do (Ressource ressource) .... se lit un peu mieux.:-) –

+2

Oui, mais c'est faux à plus d'un titre. ;) –

Questions connexes