Java有使用声明吗?

mrb*_*lah 98 java hibernate using-statement

Java是否有一个在hibernate中打开会话时可以使用的using语句?

在C#中它是这样的:

using (var session = new Session())
{


}
Run Code Online (Sandbox Code Playgroud)

因此,对象超出范围并自动关闭.

Asa*_*aph 114

Java 7引入了自动资源块管理,它将此功能引入Java平台.Java的早期版本没有任何类似的东西using.

例如,您可以使用java.lang.AutoCloseable以下方式实现的任何变量:

try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

5.0版开始,Hibernate Sessions实现AutoCloseable并可以在ARM块中自动关闭.在先前版本的Hibernate Session中没有实现AutoCloseable.因此,您需要使用Hibernate> = 5.0才能使用此功能.


Joa*_*uer 30

在Java 7之前,Java没有这样的功能(对于Java 7及以上版本,请参阅Asaph关于ARM 的答案).

你需要手动完成,这很痛苦:

AwesomeClass hooray = null;
try {
  hooray = new AwesomeClass();
  // Great code
} finally {
  if (hooray!=null) {
    hooray.close();
  }
}
Run Code Online (Sandbox Code Playgroud)

而这只是代码,既// Great code不会也不会hooray.close()抛出任何异常.

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

{
  AwesomeClass hooray = new AwesomeClass();
  // Great code
}
Run Code Online (Sandbox Code Playgroud)

但那可能不是你的意思.

  • 用于浮动简单块的+1能够限制范围.但是,每当我看到这些时,几乎总是指示该方法应该分解成更小的块. (4认同)
  • 当构造函数抛出异常时,我认为您的代码将导致NullPointerException掩盖原始异常. (3认同)

riw*_*iwi 18

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

问题中代码的语法是:

try (Session session = new Session())
{
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

注意,Session需要实现AutoClosable或其中一个(许多)子接口.


Cha*_*ion 8

技术上:

DisposableObject d = null;
try {
    d = new DisposableObject(); 
}
finally {
    if (d != null) {
        d.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这基本上是等价的.我不在乎这是不是最好的方式. (5认同)
  • 不是最好的方法.http://stackoverflow.com/questions/1909662/java-exception-handling-style (2认同)
  • 像一个真正的C#程序员一样写。;) (2认同)

Mic*_*rdt 8

最接近的Java等价物是

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