Java是否有使用声明?

Java有一个使用语句,可以在hibernate打开会话时使用?

在C#中,它是这样的:

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

所以对象超出范围并自动closures。

Java 7引入了自动资源块pipe理(Automatic Resource Block Management) ,该function将此function引入Java平台。 以前的Java版本没有类似的东西。

作为一个例子,你可以使用任何实现java.lang.AutoCloseablevariables,如下所示:

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

Java的java.io.Closeable接口由stream实现,自动扩展了AutoCloseable ,所以你可以在try块中使用stream,就像在C# using块中使用它们一样。 这相当于C#的using

从版本5.0开始,Hibernate会话实现了AutoCloseable并且可以在ARM模块中自动closures。 在以前的Hibernate Session版本中没有实现AutoCloseable 。 所以你需要在Hibernate> = 5.0才能使用这个function。

在Java 7之前,Java没有这样的function(对于Java 7,请参阅Asaph关于ARM 的答案 )。

你需要手动做,这是一个痛苦

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

这只是代码,当// Great codehooray.close()都不能抛出任何exception。

如果你真的只想限制一个variables的范围,那么一个简单的代码块就可以完成这个工作:

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

但这可能不是你的意思。

从Java 7开始: http : //blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec

问题中代码的语法是:

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

请注意, Session需要实现AutoClosable或其(多个)子接口之一。

最接近的Java相当于

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

技术上:

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

不,Java没有相当的using语句。

截至目前,没有。

不过有一个针对Java 7的ARM的build议。

如果你对资源pipe理感兴趣, Project Lombok提供@Cleanup注解。 直接从他们的网站采取:

您可以使用@Cleanup来确保在代码执行path退出当前范围之前,自动清理给定的资源。 你可以使用@Cleanup注释来注释任何局部variables声明,如下@Cleanup

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

结果,在你所在的范围的末尾, in.close() 。 这个调用保证通过try / finally构造来运行。 看看下面的例子,看看这是如何工作的。

如果你想要清理的对象的types没有close()方法,但是有一些没有参数的方法,你可以像这样指定这个方法的名字:

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

默认情况下,清理方法被认为是close()@Cleanup参数的清理方法不能通过@Cleanup

香草爪哇

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

与龙目岛

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

请看这个Java关键字列表 。

  1. 不幸的是, using关键字不是列表的一部分。
  2. 而且现在在Java中也没有通过任何其他关键字using C# using关键字的等价性。

为了模仿这种"using"行为,你将不得不使用try...catch...finally块, try...catch...finally在那里处理资源。

来自项目硬币的 ARM块将在Java 7中。这个function旨在为Java带来类似于.Net使用语法的function。

在Java 8中,您可以使用try。 请参阅以下页面。 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

回答关于限制variables范围的问题,而不是谈论自动closures/处理variables。

在Java中,您可以使用大括号定义封闭的匿名作用域。 这非常简单。

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

variableshooray只在这个范围内,而不是在它之外。

如果你有重复的variables只是暂时的,这可能是有用的。

例如,每个都有索引。 就像itemvariables在for循环中被closures一样(即仅在它内部可用), indexvariables在匿名范围上被closures。

 // 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 } } 

如果你没有for循环提供variables作用域,但是你想使用genericsvariables名,我也会使用它。

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