Pregunta

En C++ adquirimos un recurso en un constructor y lo liberamos en un destructor.

Entonces, cuando surge una excepción en medio de una función, no habrá pérdida de recursos ni mutex bloqueados ni nada por el estilo.

Las clases de Java que yo sepa no tienen destructores.Entonces, ¿cómo se hace la gestión de recursos en Java?

Por ejemplo:

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

¿Cómo se puede liberar un recurso si DoSomething genera una excepción?No podemos poner bloques try\catch en todo el código, ¿verdad?

¿Fue útil?

Solución

Sí, puedes y debes poner try/catch/finally block alrededor de tu código.En C# hay una declaración abreviada de "uso", pero en Java estás atascado con:

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

Otros consejos

Esta pregunta data de 2008 y, por lo tanto, pertenece a Java 6.Desde entonces se lanzó Java 7, que contiene una nueva característica para la gestión automática de recursos.Para una pregunta más reciente que sea relevante para Java 7, consulte esta pregunta:

¿Técnicas de Java para la liberación automática de recursos?¿"limpieza rápida"?

Es posible factorizar try/finally (y excepción y algoritmos) usando el modismo Ejecutar alrededor.Sin embargo, la sintaxis es muy detallada.

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();
    }
}

Este tipo de cosas tiene más sentido si estás abstrayendo más que intentar/finalmente.Por ejemplo, con JDBC puede ejecutar una declaración, recorrer los resultados, cerrar recursos y ajustar la excepción.

Si quieres que el bloque de uso participe en el debate sobre el cierre de Java :S

Lamento decepcionarte, pero en Java hacer use try\catch\finally bloquea mucho.Y con "mucho" quiero decir MUCHO.A veces deseo que Java tenga el bloque de uso de C#.La mayoría de las veces no necesitarás liberar recursos ya que el recolector de basura de Java se encargará de ello.

Sin embargo, las excepciones tienen su utilidad para hacer que el manejo de errores sea mucho más limpio.Puede escribir sus propias excepciones y detectarlas para cualquier cosa que esté haciendo.¡No más devolver códigos de error arbitrarios al usuario!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top