有个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的时机也不好确定。

解决方案 »

  1.   

    jOpen();        
    jDoSomething(); 
    jClose(); 
    C 是过程语言;Java是对象语言。class OO{
    public OO(){
    jOpen();
    }
        
    jOpen();
        
    jDoSomething(); jClose(); 
    }OO oo = new OO(); 
    oo.jDoSomething();
    oo.jDoSomething();
    ...
    oo.jClose();
      

  2.   

    rower203(华仔) 
    说得很对,要面向对象。。
      

  3.   

    rower203(华仔) 这样是不行的。如果每次新实例,都要Open一次,效率没法接受。这个实例我只打算用单例模式new一次,一直使用。直到消亡的时候关闭就可以了。问题就在于这个单例什么时候消亡,我可以执行Close ?
      

  4.   

    不清楚怎么解决
    只知道
    java里面有垃圾回收器,能自动销毁用完的对象,释放出内存。
      

  5.   

    用引用记数啊.比如C++代码
    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类同
      

  6.   

    Java 定义了一个特殊的方法叫做finalize(),finalize() 方法作用的一个关键元素是 Java 的垃圾回收器。事实上,你可以调用System.gc() 方法强制垃圾回收器来释放这些对象的内存。每个对象里都有这个方法,如果要做到像C++析构函数类似的功能,只要调用这个方法即可。XXX x = new XXX(); ............ x.finalize();//释放内存。
    C++的局部对象的建立是基于栈,全局对象是基于堆,而JAVA是建立在内存中的,所以只要回收内存就可以使类Free掉。
      

  7.   

    System.runFinalizersOnExit()方法在退出程序时调用每个对象的finalize() 方法。
      

  8.   

    finalize(),一定会被调用!这是 JAVA 的垃圾回收机制!
    不过在程序中,可以自定义自己打开,实例的对象!每个 JAVA 类 都是 OBJECT 的子类,都继承了 finalize() 方法!
    可以在子类中覆盖!
      

  9.   

    方法就是像 cenlmmx(学海无涯苦作舟)做得那样
    要处理好对实例的引用计数
    不再使用的时候要要记得释放引用,直到引用计数为0的时候调用jclose()
      

  10.   

    在程序建立对象就是建立一个引用对象,然后它指向一个内存地址,例如:XXX x = new XXX()
    XXX x是一个引用,然后建立实例对象new XXX(),x指向new XXX,如果照楼上只是释放引用,让对象为nill或者指向0,那么仅是让引用与对象断开连接,在跟踪的时候会发现引用实例为空或者为0,是的引用被释放了,但它原先指向的内存没有释放,依然占有着内存,在JAVA里,将自动回收这块没有用到的内存,如果在C++或者delphi等语言中它不会被回收,就会出现内存漏洞。所以finalize()是需要的。一般在程序里写:
    try{
       do more work..
    }
    finally{
       x.finalize();
    }
      

  11.   

    C++的局部对象的建立是基于栈,全局对象是基于堆,
    --------------------------------------------------
    谁说的?C++的局部对象可以在栈上,也可以在堆上
    全局对象也是同样道理.如果照楼上只是释放引用,让对象为nill或者指向0,那么仅是让引用与对象断开连接,在跟踪的时候会发现引用实例为空或者为0,是的引用被释放了,但它原先指向的内存没有释放,依然占有着内存
    ---------------------------------------------------------------------------------
    引用在C++里其实就是指针.而我说的引用记数和一般的引用概念是两回事.
    delete(this)是触发类的析构函数,包括释放内存,调用close函数等等.看来这位兄弟对C++还不太熟悉.相反我对java也不太熟悉,正在努力学习.呵呵
    这个方法我曾在C#中实现过,而C#和java在这方面差别不大,应该可以.
      

  12.   

    JVM 不保证每个 对象的 finalize() 都被调用,只保证如果最多调用一次。
      

  13.   

    to:  cenlmmx(学海无涯苦作舟)
    我又没有说你,我是说我上一楼的。你的贴我没有阅读,是因为我不懂引用记数。
    to: humanity(很健忘了)
    如果是这样,就强制回收内存System.gc()
      

  14.   

    大家帮忙看看这个
    http://community.csdn.net/Expert/topic/4272/4272775.xml?temp=.2397272
      

  15.   

    to:   lllllllllluoyi(罗毅) ( ) 信誉:100 
    /////////////////////////////////////
    to: humanity(很健忘了)
    如果是这样,就强制回收内存System.gc()///////////////////////////////////////强制回收内存也不能保证内存一定会被回收,因为java的垃圾收集器的运行也是不定时的,即使调用了
    System.gc();也一样。
      

  16.   

    请大家发言回到主题,不要再探讨内存回收的问题了。
    我都没有提到“释放内存”的需求,Close关闭并不意味着和内存相关啊。
      

  17.   

    用单例模式写.
    但是在强制gc的时候或者finalize 的时候,JVM并不是立刻关闭引用或清除内存的.
      

  18.   

    这还用考虑吗 singleton啊 就是C++也应该写成这样吧
      

  19.   

    finalize JVM 不保证一定会调用,但是保证最多调用一次。
    如果用在 线程中的话, 可以考虑 Thread.join() ,等一个线程结束时,清扫线程接上去 打扫卫生。
      

  20.   

    System.gc() 也只是请求。
    不一定 JVM 立即就会 GC , GC 执行,你的对象是否确实会被 清扫也是要你保证确实没有其他的强引用才行,也就是说还是要你清楚地 准确地界定他的 可见性,
      

  21.   

    如果每次新实例,都要Open一次,效率没法接受。这个实例我只打算用单例模式new一次,一直使用。直到消亡的时候关闭就可以了。问题就在于这个单例什么时候消亡,我可以执行Close ?楼主 这里我很看不懂,你说每次新实例都要Open一次? 单例模式的话 遇到新实例难道不用Open??
    事实上,我认为rower203(华仔) 的方法 已经给出了答案,你需要调用几次jDoSometing()都只需要执行一次jOpen(),至于关闭的时机就是你自己把握的问题了。这跟你不要用时调用析构函数很相象了呀!菜鸟说话 别介意!
      

  22.   

    to  xingming9(星螟) 
       单例模式的话 只在第一次时需要执行Open,以后是直接取对象实例,不需要再new一个。不需要new自然不会open。   rower203(华仔)的方法当然是OO的办法。但是照他的写法,new一次必然导致open一次。这是这个问题的关键,我提问题就是要解决这个问题。
      

  23.   

    to  xingming9(星螟)    也就是说我来提问题的出发点就是要请大家出主意解决rower203(华仔)的这种做法的弊病。   放大一下这个问题:Open();        耗时5秒  ---->耗时30分钟
    DoSomething(); 耗时0.1秒
    Close();       耗时0.1秒我这个程序是web后台,但是假设成桌面程序,有5个不同菜单功能需要调用这个dll,你打算怎么做?点一次菜单就等30分钟???C++里面这个问题非常好解决。java里面呢我就不知道该怎么搞了。
      

  24.   

    单例模式全局只会open()一次啊, 无论你有几个菜单。
    楼主好像没有明白单例模式哦
    至于close()你可以建立独立的静态方法,应用退出的时候调用一下就OK了。
      

  25.   

    你要多次DoSomething();为什么要多次new呢?
    new 一次是总要的吧?然后就握住这个实例oo.
    什么时候想DoSomething();就oo.DoSomething();
    认为该做的都做了就oo.close();
    OK?
    握住(Catch)这个实例oo是需要技巧的。也就是为了避免多次new,在new之前要判断是否有oo存在,
    有则用之,无则new之。
      

  26.   

    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
        }    
    }