resource getresourceasstream from files java resources

getresourceasstream - Gestión de recursos indolora en Java



java resources folder (5)

Es posible factorizar try / finally (y la excepción y los algoritmos) usando Execute around idiom. 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 try / finally. Por ejemplo, con JDBC puede ejecutar una instrucción, recorrer los resultados, cerrar recursos y ajustar la excepción.

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

Por lo tanto, cuando se produce una excepción en el medio de una función, no habrá pérdida de recursos ni bloqueos mutuos ni lo que sea.

Las clases de AFAIK Java 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 arroja una excepción? No podemos poner try / catch blocks en todo el código, ¿verdad?


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

Sin embargo, las excepciones tienen sus usos para hacer que el manejo de errores sea mucho más limpio. Puedes escribir tus propias excepciones y atraparlas por lo que sea que estés haciendo. ¡Ya no se devuelven códigos de error arbitrarios al usuario!


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

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


Si quieres que el bloque que lo usa se involucre en el debate sobre el cierre de java: S