Java是否有一个在hibernate中打开会话时可以使用的using语句?
在C#中,它类似于:
using (var session = new Session())
{
}
因此对象超出范围并自动关闭。
答案 0 :(得分:107)
Java 7引入了Automatic Resource Block Management,它将此功能引入Java平台。 Java的早期版本没有类似using
的任何内容。
例如,您可以通过以下方式使用实现java.lang.AutoCloseable
的任何变量:
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
...
}
Java的java.io.Closeable
接口由流实现,自动扩展AutoCloseable
,因此您已经可以在try
块中使用流,就像在C#中使用它们一样{{1阻止。这相当于C#的using
。
从version 5.0, Hibernate Sessions implement AutoCloseable
开始,可以在ARM块中自动关闭。在早期版本的Hibernate Session did not implement AutoCloseable
中。因此,您需要使用Hibernate> = 5.0才能使用此功能。
答案 1 :(得分:27)
在Java 7之前,Java中有没有这样的功能(对于Java 7及更高版本,请参阅Asaph's answer关于 ARM )
你需要手动完成它是一个痛苦:
AwesomeClass hooray = null;
try {
hooray = new AwesomeClass();
// Great code
} finally {
if (hooray!=null) {
hooray.close();
}
}
当// Great code
和hooray.close()
都没有抛出任何异常时,这就是代码。
如果你真的只想限制变量的范围,那么一个简单的代码块可以完成这项工作:
{
AwesomeClass hooray = new AwesomeClass();
// Great code
}
但那可能不是你的意思。
答案 2 :(得分:17)
从Java 7开始:http://blogs.oracle.com/darcy/entry/project_coin_updated_arm_spec
问题中代码的语法是:
try (Session session = new Session())
{
// do stuff
}
请注意Session
需要实现AutoClosable
或其中一个(多个)子接口。
答案 3 :(得分:8)
技术上:
DisposableObject d = null;
try {
d = new DisposableObject();
}
finally {
if (d != null) {
d.Dispose();
}
}
答案 4 :(得分:8)
最接近的java等价物是
AwesomeClass hooray = new AwesomeClass();
try{
// Great code
} finally {
hooray.dispose(); // or .close(), etc.
}
答案 5 :(得分:3)
不,Java没有等效的using
语句。
答案 6 :(得分:3)
截至目前,没有。
但是,Java 7提出了ARM。
答案 7 :(得分:2)
如果您对资源管理感兴趣,Project Lombok会提供@Cleanup
注释。直接从他们的网站上采取:
您可以使用
@Cleanup
来确保给定 资源会自动清理 在代码执行路径退出之前 你目前的范围。你这样做 注释任何局部变量 声明@Cleanup
这样的注释:
@Cleanup InputStream in = new FileInputStream("some/file");
作为一个 结果,在你的范围的最后 in,
in.close()
被调用。这个电话是 保证以一种方式运行 尝试/最后构建。看着那(这 以下示例了解其工作原理。如果您想要的对象类型 清理没有
close()
方法,但其他一些无争论 方法,您可以指定名称 这样的方法是这样的:
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
默认情况下,清除方法被假定为
close()
。需要的清理方法 参数不能通过调用@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();
}
}
}
使用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);
}
}
}
答案 8 :(得分:2)
在java 8中你可以使用try。请参考以下页面。 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
答案 9 :(得分:1)
using
关键字不属于列表。using
关键字与任何其他关键字也没有等价。要模仿此类"using"
行为,您必须使用try...catch...finally
块,您将在finally
内处置资源。
答案 10 :(得分:1)
project coin将在Java 7中。这个功能旨在为.Net提供与.Net类似的功能使用语法。
答案 11 :(得分:-1)
回答有关限制变量范围的问题,而不是谈论自动关闭/处理变量。
在Java中,您可以使用大括号定义封闭的匿名范围。这非常简单。
{
AwesomeClass hooray = new AwesomeClass()
// Great code
}
变量hooray
仅在此范围内可用,而不在其外部。
如果您只有临时的重复变量,这可能很有用。
例如,每个都有索引。就像item
变量在for循环中关闭一样(即,只在其中可用),index
变量在匿名范围内关闭。
// 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循环提供变量范围,但是你想使用通用变量名,我也会使用它。
{
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);
}