Java是否有使用声明?
Java有一个使用语句,可以在hibernate打开会话时使用?
在C#中,它是这样的:
using (var session = new Session()) { }
所以对象超出范围并自动closures。
Java 7引入了自动资源块pipe理(Automatic Resource Block Management) ,该function将此function引入Java平台。 以前的Java版本没有类似的东西。
作为一个例子,你可以使用任何实现java.lang.AutoCloseable
variables,如下所示:
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 code
或hooray.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关键字列表 。
- 不幸的是,
using
关键字不是列表的一部分。 - 而且现在在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只是暂时的,这可能是有用的。
例如,每个都有索引。 就像item
variables在for循环中被closures一样(即仅在它内部可用), index
variables在匿名范围上被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); }
- 在(…)查询中编写HQL的正确方法
- 用Hibernate和MySQL创build时间戳和上次更新时间戳
- debuggingSpringconfiguration
- 不成功:在Hibernate / JPA / HSQLDB独立版本中使用alter table XXX drop constraint YYY
- 你如何在HQL中创build一个独特的查询
- MySQL抛出错误的string值错误
- JPA:实现模型层次结构 – @MappedSuperclass与@Inheritence
- session.flush()在Hibernate中有什么用处
- 如何使用延迟加载和分页查询Primefaces dataTable的数据