¿Java tiene una instrucción using?

¿Tiene Java una statement de uso que se puede usar al abrir una sesión en hibernación?

En C # es algo así como:

using (var session = new Session()) { } 

Entonces el objeto sale del scope y se cierra automáticamente.

Java 7 introdujo la Gestión automática de bloques de recursos, que proporciona esta característica a la plataforma Java. Las versiones anteriores de Java no tenían nada parecido a using .

Como ejemplo, puede usar cualquier variable que implemente java.lang.AutoCloseable de la siguiente manera:

 try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable()) { ... } 

La interfaz java.io.Closeable de Java, implementada por streams, amplía automágicamente AutoCloseable , por lo que ya puede usar streams en un bloque try la misma forma que los usaría en un bloque que using C #. Esto es equivalente al uso de C #.

A partir de la versión 5.0, las sesiones de Hibernate implementan AutoCloseable y se pueden cerrar automáticamente en bloques ARM. En versiones anteriores de Hibernate Session no se implementó AutoCloseable . Por lo tanto, necesitará estar en Hibernate> = 5.0 para usar esta función.

Antes de Java 7 , no existía dicha característica en Java (para Java 7 y versiones posteriores, ver la respuesta de Asaph con respecto a ARM ).

Necesitabas hacerlo manualmente y fue un dolor :

 AwesomeClass hooray = null; try { hooray = new AwesomeClass(); // Great code } finally { if (hooray!=null) { hooray.close(); } } 

Y ese es solo el código cuando ni // Great code ni hooray.close() pueden arrojar excepciones.

Si realmente solo quiere limitar el scope de una variable, entonces un simple bloque de código hace el trabajo:

 { AwesomeClass hooray = new AwesomeClass(); // Great code } 

Pero eso probablemente no sea lo que querías decir.

Desde Java 7 lo hace: http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec

La syntax para el código en la pregunta sería:

 try (Session session = new Session()) { // do stuff } 

Tenga en cuenta que Session necesita implementar AutoClosable o una de sus (muchas) subinterfaces.

Técnicamente:

 DisposableObject d = null; try { d = new DisposableObject(); } finally { if (d != null) { d.Dispose(); } } 

El equivalente java más cercano es

 AwesomeClass hooray = new AwesomeClass(); try{ // Great code } finally { hooray.dispose(); // or .close(), etc. } 

No, Java no tiene una statement de using equivalente.

A partir de ahora, no.

Sin embargo, hay una propuesta de ARM para Java 7.

Si está interesado en la gestión de recursos, el Proyecto Lombok ofrece la anotación @Cleanup . Tomado directamente de su sitio:

Puede usar @Cleanup para asegurarse de que un recurso determinado se limpie automáticamente antes de que la ruta de ejecución del código salga de su scope actual. Para ello, @Cleanup cualquier statement de variable local con la anotación @Cleanup la @Cleanup manera:

@Cleanup InputStream in = new FileInputStream("some/file");

Como resultado, al final del scope en el que se encuentra, se llama a in.close() . Se garantiza que esta llamada se ejecutará mediante una construcción try / finally. Mira el ejemplo a continuación para ver cómo funciona esto.

Si el tipo de objeto que desea limpiar no tiene un método close() , sino algún otro método sin argumento, puede especificar el nombre de este método de la siguiente manera:

@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);

De manera predeterminada, se presume que el método de limpieza es close() . No se puede llamar a un método de limpieza que toma argumentos a través de @Cleanup .

Vanilla Java

 import java.io.*; public class CleanupExample { public static void main(String[] args) throws IOException { InputStream in = new FileInputStream(args[0]); try { OutputStream out = new FileOutputStream(args[1]); try { byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } } finally { out.close(); } } finally { in.close(); } } } 

Con Lombok

 import lombok.Cleanup; import java.io.*; public class CleanupExample { public static void main(String[] args) throws IOException { @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); byte[] b = new byte[10000]; while (true) { int r = in.read(b); if (r == -1) break; out.write(b, 0, r); } } } 

Por favor, consulte esta lista de palabras clave de Java .

  1. La palabra clave using desafortunadamente no es parte de la lista.
  2. Y tampoco hay equivalencia de la palabra clave C # mediante ninguna otra palabra clave como por ahora en Java.

Para imitar ese comportamiento de "using" , tendrás que usar un bloque try...catch...finally , donde try...catch...finally dispondrás de los recursos.

Los bloques ARM , desde la moneda del proyecto , estarán en Java 7. Esta función tiene la intención de proporcionar una funcionalidad similar a Java como .Net usando la syntax.

En java 8 puedes usar try. Por favor refiérase a la siguiente página. http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Para responder a la pregunta sobre limitar el scope de una variable, en lugar de hablar sobre el cierre automático / eliminación de variables.

En Java, puede definir ámbitos cerrados y anónimos usando llaves. Es extremadamente simple.

 { AwesomeClass hooray = new AwesomeClass() // Great code } 

La variable hooray solo está disponible en este ámbito, y no fuera de él.

Esto puede ser útil si tiene variables repetitivas que son solo temporales.

Por ejemplo, cada uno con índice. Al igual que la variable de item se cierra sobre el bucle for (es decir, solo está disponible dentro de él), la variable de index se cierra sobre el scope anónimo.

 // first loop { Integer index = -1; for (Object item : things) {index += 1; // ... item, index } } // second loop { Integer index = -1; for (Object item : stuff) {index += 1; // ... item, index } } 

También uso esto a veces si no tiene un bucle for para proporcionar un scope variable, pero desea usar nombres generics de variables.

 { User user = new User(); user.setId(0); user.setName("Andy Green"); user.setEmail("andygreen@gmail.com"); users.add(user); } { User user = new User(); user.setId(1); user.setName("Rachel Blue"); user.setEmail("rachelblue@gmail.com"); users.add(user); }