在java中模拟python的With语句

And*_*yuk 8 python java connection

在Java中是否有像Python这样上下文管理器?

例如,说我想做类似以下的事情:

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

   c.close();
   return c;
}
Run Code Online (Sandbox Code Playgroud)

在python中我只有:

with( C.getConnection().open() as c):
   Item i = c.query(itemID);
   return i;
Run Code Online (Sandbox Code Playgroud)

小智 20

Java 7引入了一个新功能来解决这个问题:"尝试使用资源"

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

使用try-with-resources静静地关闭资源

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

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
}
Run Code Online (Sandbox Code Playgroud)

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

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


tza*_*man 7

现在不行; Java仍然没有为这种模式添加语法糖.尽管如此,它不会像with(Python)或using(C#)一样干净,但你至少可以通过对块c.close()内部进行一次调用来清理它finally,而不是像你做的那样两次:

try {
    // use c
} finally {
    c.close()
}
Run Code Online (Sandbox Code Playgroud)

这也使它与两者withusing实际实现的方式一致,这是一个try..finally块(不是a try..catch).