Question

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 ni de mutex verrouillés ou autre.

Les classes Java AFAIK n'ont pas de destructeurs.Alors, comment gérer les ressources en Java.

Par exemple:

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

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

Était-ce utile?

La solution

Oui, vous pouvez et devez mettre un bloc try/catch/finally autour de votre code.En C#, il existe une instruction abrégée « using », mais en Java, vous êtes coincé avec :

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

Autres conseils

Cette question date de 2008 et concerne donc Java 6.Depuis lors, Java 7 a été publié, qui contient une nouvelle fonctionnalité de gestion automatique des ressources.Pour une question plus récente concernant Java 7, consultez cette question :

techniques Java pour la libération automatique des ressources ?"nettoyage rapide" ?

Il est possible de prendre en compte try/finally (ainsi que les exceptions et les algorithmes) en utilisant l'idiome Execute around.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 plus d'abstraction que d'essayer/enfin.Par exemple, avec JDBC, vous pouvez exécuter une instruction, parcourir les résultats, fermer des ressources et encapsuler l'exception.

Si vous souhaitez que le bloc using soit impliqué dans le débat sur la fermeture Java :S

Désolé de vous décevoir mais en Java nous faire utilisez beaucoup de blocs try\catch\finally.Et avec "beaucoup", je veux dire BEAUCOUP.Je souhaite parfois que Java ait le bloc using 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 intercepter pour tout ce que vous faites.Plus besoin de renvoyer des codes d'erreur arbitraires à l'utilisateur !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top