Java有使用声明吗?

时间:2010-01-06 21:15:20

标签: java hibernate using-statement

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

在C#中,它类似于:

using (var session = new Session())
{


}

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

12 个答案:

答案 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 codehooray.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)

请参阅此List of Java Keywords

  1. 遗憾的是,using关键字不属于列表。
  2. 目前在Java中,C#using关键字与任何其他关键字也没有等价。
  3. 要模仿此类"using"行为,您必须使用try...catch...finally块,您将在finally内处置资源。

答案 10 :(得分:1)

来自ARM blocks

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