有个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的时机也不好确定。
DoSomething(); 耗时0.1秒
Close(); 耗时0.1秒我现在已经写了一个javaBean,对应3个方法,并且调试成功。
jOpen();
jDoSomething();
jClose(); 但是由于DoSomething是被多次频繁调用的方法,所以不能每次都去Open,Close.
所以我希望在构造的时候Open一次,直到用完了再Close。
这样是不是要写一个“静态类”一样的东西保证构造时Open一次,一直使用,到析构的时候再做一次Close就够了。
1.这个静态类怎么写呢?
2.java没有析构函数,Close的时机也不好确定。
jDoSomething();
jClose();
C 是过程语言;Java是对象语言。class OO{
public OO(){
jOpen();
}
jOpen();
jDoSomething(); jClose();
}OO oo = new OO();
oo.jDoSomething();
oo.jDoSomething();
...
oo.jClose();
说得很对,要面向对象。。
只知道
java里面有垃圾回收器,能自动销毁用完的对象,释放出内存。
class A
{
public:
static A* GetInstance()
{
if (NULL == a) a = new A();
counter++;
return a;
}
static void DestotyInstance()
{
counter--;
if (0 == counter) delete(this);
}
private:
A(){ open();}
~A(){ close(); }
static A* a;
static int counter;
}
int A::counter = 0;
A* A::a = 0;Java类同
C++的局部对象的建立是基于栈,全局对象是基于堆,而JAVA是建立在内存中的,所以只要回收内存就可以使类Free掉。
不过在程序中,可以自定义自己打开,实例的对象!每个 JAVA 类 都是 OBJECT 的子类,都继承了 finalize() 方法!
可以在子类中覆盖!
要处理好对实例的引用计数
不再使用的时候要要记得释放引用,直到引用计数为0的时候调用jclose()
XXX x是一个引用,然后建立实例对象new XXX(),x指向new XXX,如果照楼上只是释放引用,让对象为nill或者指向0,那么仅是让引用与对象断开连接,在跟踪的时候会发现引用实例为空或者为0,是的引用被释放了,但它原先指向的内存没有释放,依然占有着内存,在JAVA里,将自动回收这块没有用到的内存,如果在C++或者delphi等语言中它不会被回收,就会出现内存漏洞。所以finalize()是需要的。一般在程序里写:
try{
do more work..
}
finally{
x.finalize();
}
--------------------------------------------------
谁说的?C++的局部对象可以在栈上,也可以在堆上
全局对象也是同样道理.如果照楼上只是释放引用,让对象为nill或者指向0,那么仅是让引用与对象断开连接,在跟踪的时候会发现引用实例为空或者为0,是的引用被释放了,但它原先指向的内存没有释放,依然占有着内存
---------------------------------------------------------------------------------
引用在C++里其实就是指针.而我说的引用记数和一般的引用概念是两回事.
delete(this)是触发类的析构函数,包括释放内存,调用close函数等等.看来这位兄弟对C++还不太熟悉.相反我对java也不太熟悉,正在努力学习.呵呵
这个方法我曾在C#中实现过,而C#和java在这方面差别不大,应该可以.
我又没有说你,我是说我上一楼的。你的贴我没有阅读,是因为我不懂引用记数。
to: humanity(很健忘了)
如果是这样,就强制回收内存System.gc()
http://community.csdn.net/Expert/topic/4272/4272775.xml?temp=.2397272
/////////////////////////////////////
to: humanity(很健忘了)
如果是这样,就强制回收内存System.gc()///////////////////////////////////////强制回收内存也不能保证内存一定会被回收,因为java的垃圾收集器的运行也是不定时的,即使调用了
System.gc();也一样。
我都没有提到“释放内存”的需求,Close关闭并不意味着和内存相关啊。
但是在强制gc的时候或者finalize 的时候,JVM并不是立刻关闭引用或清除内存的.
如果用在 线程中的话, 可以考虑 Thread.join() ,等一个线程结束时,清扫线程接上去 打扫卫生。
不一定 JVM 立即就会 GC , GC 执行,你的对象是否确实会被 清扫也是要你保证确实没有其他的强引用才行,也就是说还是要你清楚地 准确地界定他的 可见性,
事实上,我认为rower203(华仔) 的方法 已经给出了答案,你需要调用几次jDoSometing()都只需要执行一次jOpen(),至于关闭的时机就是你自己把握的问题了。这跟你不要用时调用析构函数很相象了呀!菜鸟说话 别介意!
单例模式的话 只在第一次时需要执行Open,以后是直接取对象实例,不需要再new一个。不需要new自然不会open。 rower203(华仔)的方法当然是OO的办法。但是照他的写法,new一次必然导致open一次。这是这个问题的关键,我提问题就是要解决这个问题。
DoSomething(); 耗时0.1秒
Close(); 耗时0.1秒我这个程序是web后台,但是假设成桌面程序,有5个不同菜单功能需要调用这个dll,你打算怎么做?点一次菜单就等30分钟???C++里面这个问题非常好解决。java里面呢我就不知道该怎么搞了。
楼主好像没有明白单例模式哦
至于close()你可以建立独立的静态方法,应用退出的时候调用一下就OK了。
new 一次是总要的吧?然后就握住这个实例oo.
什么时候想DoSomething();就oo.DoSomething();
认为该做的都做了就oo.close();
OK?
握住(Catch)这个实例oo是需要技巧的。也就是为了避免多次new,在new之前要判断是否有oo存在,
有则用之,无则new之。
{
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
}
}