Java有using语句吗?

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

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

在C#中,它类似于:

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);
    }