2009-03-26 9 views
5

En C++ tenemos el patrón Adquisición de recursos es la inicialización (RAII), que simplifica enormemente la gestión de recursos. La idea es proporcionar algún objeto de envoltura para cualquier clase de recursos. El destructor del objeto de envoltura es entonces responsable de liberar los recursos, cuando está fuera de su alcance. Por ejemplo:Es C++ como la administración de recursos posible en Java

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

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

El uso más común son punteros inteligentes. Pero hay muchos otros tipos de recursos (archivos, mutexes, sockets, etc.) que se pueden gestionar exactamente de la misma manera.

En Java uno no tiene que preocuparse por la administración de la memoria. Pero todos los otros tipos de recursos permanecen. Hay finalmente el bloque, pero su uso es bastante inconveniente, especialmente cuando se pueden lanzar muchas excepciones diferentes.

Entonces, ¿mi pregunta es si hay algún patrón de Java que proporcione una funcionalidad equivalente a C++ RAII? De lo contrario, comparta sus mejores prácticas en esta área (en lugar de la final, a menos que se use de alguna manera sofisticada).

+0

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

+0

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

+0

"que simplifica extremadamente la gestión de recursos" ¿Estás bromeando? – hasen

Respuesta

10

Puede utilizar el habitual acquire; try { use; } finally { release; }. Alternativamente, puede abstraer el manejo de recursos con el Execute Around idiom.

4

Joshua Bloch ha propuesto la adición de un mecanismo llamado Automatic Resource Management a Java como parte de la moneda Proyecto (pequeños cambios en el lenguaje de JDK 7):

+0

¿Cuál es el azúcar sintáctico (útil) para try/catch/finally? Entonces, si quiere hacer algo hoy (a diferencia de 2011), vea las respuestas sobre try/catch/finally. –

+2

Excepto que prueba/finalmente apesta en comparación con RAII. La pregunta original era si Java tenía algo comparable a RAII, y la respuesta es, aparentemente, no. –

1

Para muchos codificadores, la fuerza de la expresión idiomática RAII es que la vida del subyacente el recurso está vinculado a un bloque de alcance, haciendo las cosas más simples de hacer y mantener; en última instancia, reducir los errores de no poder liberar ese recurso.

Desafortunadamente no puede imitar este comportamiento en Java ya que no puede crear sus propias estructuras limitadas al alcance. Un lenguaje similar a Java que se ha tratado de resolver este problema es C#:

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

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

Tal vez vamos a ver como esta funcionalidad implementada en el futuro.

+0

python agregó esto también con la construcción 'with' – hasen

+0

Eso no es verdad. Ciertamente puedes simularlo en java como lo sugiere Tom Hawtin - tackline. – kirakun

+0

@Kirakun: simular "eso"; ¿un alcance? Mi frente creció una pulgada. –

Cuestiones relacionadas