如何定义Java对象被回收或删除时执行的事件?也就是相当于Delphi中的Destroy事件?(50分)

  • 主题发起人 主题发起人 DT
  • 开始时间 开始时间
D

DT

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在某对象被删除或撤销时执行某些清理的工作,在Java中如何实现?
 
最好不要这样,因为Java中对象释放是由虚拟机管理的,他的发生时机你没有办法确定.如果你硬要在覆盖释放方法来处理啊,很容易出问题的.
 
没有什么其他变通的方法?
像在Servlet中,不是可以通过重载destroy方法来进行Servlet撤销时的处理吗?
我也是正是这么想,如何在其他某些类中,如果有些资料在一开始时建立最后要撤销,要回收这些资源(例如数据库连接)不是在撤销时进行Close最合适吗?而且比较方便.
 
You can overwrite the method finalize() of this class,then
call method:System.gc().if a object of this class has no any reference refering to it,then
,this object will be collected as a garbage by garbage collector.There is
an example below:
public class TestFinalize
{public void finalize()
{System.out.println("call finalize()");
}
public static void main(String[] args)
{/*creat a object without reference,so it's a garbage.
*/
new TestFinalize();
/*force to execute garbage collection,so the garbage above will be collected.When a garbage object be collected,the method finalize() of this class must can be executed automatically before.
*/
System.gc();
}
}
The answer can be find in chapter 4 of <<thinking in java>>.
I'm learning java and english.So please correct my language error when correcting my program error.welcome exchanging.
 
上面已经提到:finalize() 方法
 
我试了一下,重载这个方法后一定要用System.gc()才能使该事件运行;
如果该对象已经没有引用了,但也不会运行事件,直到程序运行完了也不会运行该事件,
一定要用System.gc()才行,这样不是很不方便?而且不可预知?
程序如下:
public class TestMain
{
public static void main( String[] args)
{
System.out.println("Test begin
");
Test myTest = new Test(1);
myTest = null;
Test myTest2 = new Test(2);
System.gc();
myTest2 = null;
//System.gc();
System.out.println("Program Over!");
}
}
public class Test
{
int no;
public Test()
{
System.out.println("I am Creat!");
}
public Test( int i)
{
no = i;
System.out.println("I am Creat! No=" + String.valueOf(i));
}
public void finalize()
{
System.out.println("Test is Destory No= " + String.valueOf(no));
}
}
运行结果如下:
C:/j2sdk1.4.1_01/bin/java.exe TestMain
Test begin
I am Creat! No=1
I am Creat! No=2
Test is Destory No= 1
Program Over!
 
绝对不能指望通过finalize()的方式来执行清理工作。这是java编程最基本的一点。
比如说,在finalize的时候去执行关闭数据库连接等。
在虚拟机中,何时执行销毁对象是无法预计的,你可以当他永远不发生GC。
也不要试图去自己执行GC。
关于数据库连接的释放,是应该在你完成某次操作的时候完成的,这不应该属于对象销毁的一部分。一个Transaction一定是必须在同一个方法中开启/结束,connection也必须要在一个方法中create/disconnect,否则,程序的完整性和可读性都得不到保证。
 
有同感,Java设计的教程好像都说Java没有类似Destroy的事件.
不过,这个Destroy真的有用啊,就像一个程序在临死前结束一些未了的心愿...
有没有 其他的实现办法?
 
不觉得需要这样,你的程序结构设计得好,根本不需要这样考虑.
try
{}
finally/catch
{
}
 
我要建立一个对象,他会被其他程序不定时调用,他建立时会进行初始化,并占用了一些系统资源,然后不知何时会结束,那么需要在他结束时将占用的资源释放,何解?
 
再等等,有没有什么更好的答案?如果嫌分少说一声我再加。
 
Ok了,其他自己找好了.......
 
后退
顶部