我听说过这个"执行周围"的习语(或类似的)是什么?为什么我可以使用它,为什么我不想使用它?
自从我使用Java以来已经至少5年了,当时,只要你想分配一个需要清理的对象(例如套接字,数据库句柄),你就必须记得添加一个finally块并调用清理方法.那里.
相比之下,在C++(或其他对象生命周期是确定性的语言,例如Perl)中,类实现者将定义一个析构函数,只要该类的对象超出范围,该函数就会执行清理.这种方法的优点是对象的用户不会忘记清理它 - 即使抛出异常,也会自动调用析构函数.这种方法以RAII的相当可怕的名字命名 - "资源获取是初始化".
根据我的经验,做"RAII方式"的事情在不必担心是否以及何时发生资源解除分配方面为我节省了大量精神开销.我们正在考虑将Java用于一个中型项目,我想知道自从我上次查看它以来,语言中添加的许多新功能是否存在某种确定性破坏.(我希望因为我的抱怨"Java没有RAII" 在这个帖子上被斥责,但到目前为止我还没能通过谷歌搜索找到任何细节.)
所以,如果有人能够指出一些关于如何在Java中实现这一目标的介绍性材料,那就太棒了!
我刚刚玩了Java文件系统API,并提供了以下函数,用于复制二进制文件.最初的源代码来自Web,但我添加了try/catch/finally子句,以确保在出现错误之前,在退出函数之前缓冲流将被关闭(因此,我的操作系统资源被释放).
我减少了功能以显示模式:
public static void copyFile(FileOutputStream oDStream, FileInputStream oSStream) throw etc...
{
BufferedInputStream oSBuffer = new BufferedInputStream(oSStream, 4096);
BufferedOutputStream oDBuffer = new BufferedOutputStream(oDStream, 4096);
try
{
try
{
int c;
while((c = oSBuffer.read()) != -1) // could throw a IOException
{
oDBuffer.write(c); // could throw a IOException
}
}
finally
{
oDBuffer.close(); // could throw a IOException
}
}
finally
{
oSBuffer.close(); // could throw a IOException
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我不能把这两个close()放在finally子句中,因为第一个close()可以抛出,然后,第二个不会被执行.
我知道C#有Dispose模式,可以使用using关键字来处理这个问题.
我甚至知道更好的C++代码(使用类似Java的API): …