java没有析构函数,请教大家是怎样解决这个问题的。

leonpard 2005-09-02 04:18:37
有个VC写的DLL有3个方法,

Open(); 耗时5秒
DoSomething(); 耗时0.1秒
Close(); 耗时0.1秒

我现在已经写了一个javaBean,对应3个方法,并且调试成功。
jOpen();
jDoSomething();
jClose();

但是由于DoSomething是被多次频繁调用的方法,所以不能每次都去Open,Close.
所以我希望在构造的时候Open一次,直到用完了再Close。
这样是不是要写一个“静态类”一样的东西保证构造时Open一次,一直使用,到析构的时候再做一次Close就够了。
1.这个静态类怎么写呢?
2.java没有析构函数,Close的时机也不好确定。
...全文
11866 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linyco 2005-10-03
  • 打赏
  • 举报
回复
public class YourClass
{
private int count = 0;
private static YourClass INSTANCE = new YourClass();
/**
*这里一定要是私有的
*/
private YourClass()
{
//some code here;
}
public void jOpen()
{
//The thing you want to do in open() method
}
public void doSomething()
{
//your code here;
}
//参照 lllllllllluoyi(罗毅) 的说明就明白了
public void finalize()
{
//The thing you want to do in close
}
}
rower203 2005-09-28
  • 打赏
  • 举报
回复
你要多次DoSomething();为什么要多次new呢?
new 一次是总要的吧?然后就握住这个实例oo.
什么时候想DoSomething();就oo.DoSomething();
认为该做的都做了就oo.close();
OK?
握住(Catch)这个实例oo是需要技巧的。也就是为了避免多次new,在new之前要判断是否有oo存在,
有则用之,无则new之。
super_zzw 2005-09-22
  • 打赏
  • 举报
回复
单例模式全局只会open()一次啊, 无论你有几个菜单。
楼主好像没有明白单例模式哦
至于close()你可以建立独立的静态方法,应用退出的时候调用一下就OK了。
leonpard 2005-09-22
  • 打赏
  • 举报
回复
to xingming9(星螟)

也就是说我来提问题的出发点就是要请大家出主意解决rower203(华仔)的这种做法的弊病。

放大一下这个问题:

Open(); 耗时5秒 ---->耗时30分钟
DoSomething(); 耗时0.1秒
Close(); 耗时0.1秒

我这个程序是web后台,但是假设成桌面程序,有5个不同菜单功能需要调用这个dll,你打算怎么做?点一次菜单就等30分钟???

C++里面这个问题非常好解决。java里面呢我就不知道该怎么搞了。
leonpard 2005-09-22
  • 打赏
  • 举报
回复
to xingming9(星螟)


单例模式的话 只在第一次时需要执行Open,以后是直接取对象实例,不需要再new一个。不需要new自然不会open。

rower203(华仔)的方法当然是OO的办法。但是照他的写法,new一次必然导致open一次。这是这个问题的关键,我提问题就是要解决这个问题。
yedong309 2005-09-22
  • 打赏
  • 举报
回复
赋个nothing 行不?
humanity 2005-09-21
  • 打赏
  • 举报
回复
System.gc() 也只是请求。
不一定 JVM 立即就会 GC , GC 执行,你的对象是否确实会被 清扫也是要你保证确实没有其他的强引用才行,也就是说还是要你清楚地 准确地界定他的 可见性,
xingming9 2005-09-21
  • 打赏
  • 举报
回复
如果每次新实例,都要Open一次,效率没法接受。

这个实例我只打算用单例模式new一次,一直使用。直到消亡的时候关闭就可以了。

问题就在于这个单例什么时候消亡,我可以执行Close ?

楼主 这里我很看不懂,你说每次新实例都要Open一次? 单例模式的话 遇到新实例难道不用Open??
事实上,我认为rower203(华仔) 的方法 已经给出了答案,你需要调用几次jDoSometing()都只需要执行一次jOpen(),至于关闭的时机就是你自己把握的问题了。这跟你不要用时调用析构函数很相象了呀!菜鸟说话 别介意!
humanity 2005-09-20
  • 打赏
  • 举报
回复
finalize JVM 不保证一定会调用,但是保证最多调用一次。


如果用在 线程中的话, 可以考虑 Thread.join() ,等一个线程结束时,清扫线程接上去 打扫卫生。
wanghongtaoleifeng 2005-09-20
  • 打赏
  • 举报
回复
这还用考虑吗 singleton啊 就是C++也应该写成这样吧
wudouguerwxx 2005-09-20
  • 打赏
  • 举报
回复
用单例模式写.
但是在强制gc的时候或者finalize 的时候,JVM并不是立刻关闭引用或清除内存的.
leonpard 2005-09-18
  • 打赏
  • 举报
回复
请大家发言回到主题,不要再探讨内存回收的问题了。
我都没有提到“释放内存”的需求,Close关闭并不意味着和内存相关啊。
qjyh 2005-09-15
  • 打赏
  • 举报
回复
to: lllllllllluoyi(罗毅) ( ) 信誉:100
/////////////////////////////////////
to: humanity(很健忘了)
如果是这样,就强制回收内存System.gc()

///////////////////////////////////////

强制回收内存也不能保证内存一定会被回收,因为java的垃圾收集器的运行也是不定时的,即使调用了
System.gc();也一样。
  • 打赏
  • 举报
回复
大家帮忙看看这个
http://community.csdn.net/Expert/topic/4272/4272775.xml?temp=.2397272
Roy_Sashulin 2005-09-05
  • 打赏
  • 举报
回复
to: cenlmmx(学海无涯苦作舟)
我又没有说你,我是说我上一楼的。你的贴我没有阅读,是因为我不懂引用记数。


to: humanity(很健忘了)
如果是这样,就强制回收内存System.gc()
sankt 2005-09-04
  • 打赏
  • 举报
回复
gz
jblz 2005-09-04
  • 打赏
  • 举报
回复
我来up
humanity 2005-09-04
  • 打赏
  • 举报
回复
JVM 不保证每个 对象的 finalize() 都被调用,只保证如果最多调用一次。
cenlmmx 2005-09-04
  • 打赏
  • 举报
回复
C++的局部对象的建立是基于栈,全局对象是基于堆,
--------------------------------------------------
谁说的?C++的局部对象可以在栈上,也可以在堆上
全局对象也是同样道理.

如果照楼上只是释放引用,让对象为nill或者指向0,那么仅是让引用与对象断开连接,在跟踪的时候会发现引用实例为空或者为0,是的引用被释放了,但它原先指向的内存没有释放,依然占有着内存
---------------------------------------------------------------------------------
引用在C++里其实就是指针.而我说的引用记数和一般的引用概念是两回事.
delete(this)是触发类的析构函数,包括释放内存,调用close函数等等.

看来这位兄弟对C++还不太熟悉.相反我对java也不太熟悉,正在努力学习.呵呵
这个方法我曾在C#中实现过,而C#和java在这方面差别不大,应该可以.
Muzhu 2005-09-03
  • 打赏
  • 举报
回复
楼上的很强啊!还在学引用记数
加载更多回复(14)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧