Java有类似于using语句的功能吗?

125

Java中是否有类似C#的using语句,在Hibernate打开会话时使用?

在C#中,它是这样的:

using (var session = new Session())
{


}

所以对象超出作用域后会自动关闭。


4
允许为对象定义范围。这不是using的作用。范围不等于生命周期(严格来说,using也不涉及生命周期,因为Dispose不会销毁对象的内存)。 - Joren
5
@Joren,您的评论正在得到赞同,但我需要更多信息。您是提出“终身”概念的人,然后又说这不是关于“终身”的。范围是MSDN库中定义所使用的术语,也许我使用不当了。您如何定义“using语句”。 - Jla
1
作用域是指代码中可以引用标识符而无需使用完全限定名称(局部变量、类型、方法名等)的区域。生命周期是指对象或变量可访问的时间。请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx - Joren
2
例如,如果您有一个本地变量并将值类型实例分配给它,则该值的生命周期将在其变量的生命周期结束时结束。但是,如果您分配了一个对象,并将其引用存储在本地中,则该对象的生命周期可能会延长到其存储的生命周期之后,只要还有其他地方对该对象的引用。至于“using”,它会在其范围结束时自动“处理”对象,但它不会“释放”对象-直到所有引用都消失,其生命周期才结束。 - Joren
1
可能是"using" keyword in java的重复问题。 - HaveNoDisplayName
显示剩余4条评论
12个回答

1

ARM blocks,来自project coin,将会出现在Java 7中。这个功能旨在使用语法将类似的功能带给Java,就像.NET一样。


0
回答关于限制变量作用域的问题,我们不需要谈论自动关闭/释放变量。
在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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接