在 java 中模拟 python 的 With 语句

2022-09-04 05:21:20

在Java中是否有类似Python上下文管理器的东西?

例如,假设我想执行如下操作:

getItem(itemID){
   Connection c = C.getConnection();
   c.open();
   try{
    Item i = c.query(itemID);
   }catch(ALLBunchOfErrors){
      c.close();
   }

   c.close();
   return c;
}

在python中,我只有:

with( C.getConnection().open() as c):
   Item i = c.query(itemID);
   return i;

答案 1

Java 7 引入了一项新功能来解决此问题:“尝试使用资源”

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

使用资源试用悄悄关闭资源

语法是将资源放在 try 关键字后面的括号中:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}

在 Java 7 之前,您可以使用 finally 块。

BufferedReader br = new BufferedReader(new FileReader(path));
try {
    return br.readLine();
} finally {
    if (br != null) br.close();
}

答案 2

目前还不行。Java仍然没有为这种模式添加语法糖。不过,它不会像(Python)或(C#)那样干净,但你至少可以通过对一个块内部进行一次调用来清理它,而不是像你所做的那样两次:withusingc.close()finally

try {
    // use c
} finally {
    c.close()
}

这也使其与两者的实际实现方式一致,即块(而不是块)。withusingtry..finallytry..catch