Java有using语句吗?
Java是否有一个using语句可以在hibernate中打开会话时使用 在C#中,它类似于:Java有using语句吗?,java,hibernate,using-statement,Java,Hibernate,Using Statement,Java是否有一个using语句可以在hibernate中打开会话时使用 在C#中,它类似于: using (var session = new Session()) { } 因此对象超出范围并自动关闭。Java7的引入将此功能引入Java平台。以前的Java版本没有类似于使用的 例如,您可以通过以下方式使用实现java.lang.AutoCloseable的任何变量: try(ClassImplementingAutoCloseable obj = new ClassImplementi
using (var session = new Session())
{
}
因此对象超出范围并自动关闭。Java7的引入将此功能引入Java平台。以前的Java版本没有类似于使用的
例如,您可以通过以下方式使用实现java.lang.AutoCloseable
的任何变量:
try(ClassImplementingAutoCloseable obj = new ClassImplementingAutoCloseable())
{
...
}
Java的Java.io.Closeable
接口由streams实现,它自动扩展了AutoCloseable
,因此您可以在块中使用流,就像在C#块中使用流一样。这相当于C#的使用
自,可在臂块中自动关闭。在以前版本的Hibernate中。因此,您需要使用Hibernate>=5.0才能使用此功能。否,Java没有使用与之相当的语句的。技术上:
DisposableObject d = null;
try {
d = new DisposableObject();
}
finally {
if (d != null) {
d.Dispose();
}
}
到目前为止,还没有
但是,有一项针对Java 7的建议。在Java 7之前,Java中没有此类功能(对于Java 7及以上版本,请参阅关于ARM)
您需要手动执行,这是一种痛苦:
当//Great code
和hooray.close()
都不能抛出任何异常时,这就是代码
如果真的只想限制变量的范围,那么一个简单的代码块就可以完成这项工作:
{
AwesomeClass hooray = new AwesomeClass();
// Great code
}
但这可能不是你的意思。最接近的java等价物是
AwesomeClass hooray = new AwesomeClass();
try{
// Great code
} finally {
hooray.dispose(); // or .close(), etc.
}
请看这个
不幸的是,使用
关键字的不在列表中
在Java中,C#使用
关键字与任何其他关键字都是不等价的
要使用“
行为来模拟这样的,您必须使用try…catch…finally
块,在该块中,您将在Java 7中处理finally
中的资源。这一特性旨在使用语法为Java带来与.Net类似的功能。如果您对资源管理感兴趣,请提供注释。直接从其网站获取:
您可以使用@Cleanup
来确保给定的
资源将自动清理
在代码执行路径退出之前
您当前的范围。你是靠我来做这件事的
注释任何局部变量
用@Cleanup
像这样的注释:
@Cleanup InputStream in=new FileInputStream(“some/file”)代码>
作为一个
结果,在范围的末尾,您
在中,in.close()
被调用。这个电话是
保证通过一个
尝试/最终构建。看这张照片
下面是一个示例,以了解其工作原理
如果您想要的对象类型
清理没有close()
方法,但其他一些方法没有参数
方法,则可以指定
这种方法是这样的:
@Cleanup(“dispose”)org.eclipse.swt.widgets.CoolBar=新的CoolBar(父级,0)代码>
默认情况下,假定清除方法为
close()
。一种需要
参数不能通过调用
@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 7,它可以:
问题中代码的语法为:
try (Session session = new Session())
{
// do stuff
}
请注意,会话
需要实现一个或多个子接口。回答有关限制变量范围的问题,而不是谈论自动关闭/处理变量
在Java中,可以使用花括号定义封闭的匿名作用域。非常简单
{
AwesomeClass hooray = new AwesomeClass()
// Great code
}
变量hooray
仅在此范围内可用,不在此范围之外
如果您有只是临时的重复变量,这可能会很有用
例如,每个都有索引。就像项
变量在for循环中关闭一样(即,仅在for循环中可用),索引
变量在匿名范围内关闭
// 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);
}
在Java8中,您可以使用try。请参阅下页 这不是最好的方法。这在本质上是等价的。我不在乎这是否是最好的方式。像一个真正的C#程序员那样编写如果//Great code
引发异常,那么Java等价物应该不会有问题。当构造函数引发异常时,我认为您的代码将导致一个NullPointerException,它会掩盖原始异常。@Michael:实际上我的示例不会编译,因为horray
可能尚未在该点初始化(现在已修复)。+1表示浮动简单块能够限制范围。然而,每当我看到这些,它几乎总是一个指标,该方法应该被分解成更小的块。如果你想从构造函数中捕获任何异常,你必须将它放在try块中。用另一个try/catch来包装整件事是很麻烦的。事实上,使用
不是一个关键字并不意味着什么。正如@BalusC所提到的,同样的功能可以(也将!)用另一个关键字实现。我同意!但现在,它并不存在,对吗?这就是OP所问的,如果刚才有类似的东西。很高兴知道它将出现在未来的版本中,但这并不会改变现在的情况,不管怎样。无论如何,@BalusC提供的信息非常棒!=)我同意这一点,但你的帖子似乎说,使用
不在Java关键字列表中,这意味着Java语言中不存在此功能。这不是真的。如果这是我的帖子所说的,那么我将编辑到r
{
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);
}