2009-03-26 3 views
5

En C++, le modèle Acquisition de ressources est l'initialisation (RAII), ce qui simplifie considérablement la gestion des ressources. L'idée est de fournir un objet enveloppant pour tout type de ressources. Le destructeur de l'objet wrapping est alors responsable de la libération des ressources, quand il sort de sa portée. Par exemple:La gestion des ressources de type C++ est-elle possible en Java?

{ 
    auto_ptr<int> smartPointer = new int; 
    // some other code 

} // the memory allocated for the int is released automatically 
    // by smartPointer's destructor 

L'utilisation la plus courante est les pointeurs intelligents. Mais, il existe de nombreux autres types de ressources (fichiers, mutex, sockets, etc.) qui peuvent être gérés exactement de la même manière.

En Java, vous n'avez pas à déranger la gestion de la mémoire. Mais tous les autres types de ressources restent. Il y a enfin le bloc, mais son utilisation est assez gênante, surtout quand de nombreuses exceptions différentes peuvent être levées. Donc, ma question est de savoir s'il existe un modèle Java qui fournit une fonctionnalité équivalente à C++ RAII? Si ce n'est pas le cas, veuillez partager vos meilleures pratiques dans ce domaine (au lieu de la finale, à moins qu'elle ne soit utilisée de manière sophistiquée).

+0

Voir cette question: http://stackoverflow.com/questions/194261/raii-in-java-is-resource-disposal-always-so-ugly-was-i-had-a-dream – Eclipse

+0

Aussi: http : //stackoverflow.com/questions/477399/does-java-support-raii-deterministic-destruction – Eclipse

+0

"ce qui simplifie énormément la gestion des ressources" es-tu une blague? – hasen

Répondre

10

Vous pouvez utiliser la acquire; try { use; } finally { release; } habituelle. Vous pouvez également faire abstraction de la gestion des ressources avec le Execute Around idiom.

4

Joshua Bloch a proposé d'ajouter un mécanisme appelé Automatic Resource Management à Java dans le cadre du Coin projet (petits changements linguistiques pour JDK 7):

+0

Ce qui est juste du sucre syntaxique (utile) pour try/catch/finally. Donc, si vous voulez faire quelque chose aujourd'hui (par opposition à 2011), voir les réponses à propos de try/catch/finally. –

+2

Sauf que essayer/finalement suce en comparaison à RAII. La question initiale était de savoir si Java avait quelque chose de comparable à RAII, et la réponse est, apparemment, non. –

1

Pour de nombreux codeurs, la force de l'idiome RAII est que la vie du sous-jacent la ressource est liée à un bloc de portée, rendant les choses plus simples à créer et à maintenir; en fin de compte réduire les erreurs de ne pas libérer cette ressource.

Malheureusement, vous ne pouvez pas imiter ce comportement dans Java car vous ne pouvez pas créer vos propres structures liées à la portée. Un langage similaire à Java qui a essayé de résoudre ce problème est C#:

// explicit release 
MyClass obj = MyClass(); 
obj.UseIt(); 
obj.Dispose(); 

// RAII-like (scope-bound) release 
using(MyClass obj = new MyClass()) 
{ 
    obj.UseIt(); 
} 

Peut-être que nous verrons des fonctionnalités comme celui-ci mis en œuvre à l'avenir.

+0

python ajouté cela aussi bien avec la construction 'with' – hasen

+0

Ce n'est pas vrai. Vous pouvez certainement le simuler en Java comme suggéré par Tom Hawtin - tackline. – kirakun

+0

@Kirakun: simuler "it"; une portée? Mon front a juste grandi d'un pouce. –

Questions connexes