2012-01-12 17 views
8

मुझे बताया गया है और read है कि SWT ऑब्जेक्ट्स को dispose विधि को कॉल करके स्पष्ट रूप से निपटाया जाना चाहिए। हालांकि, निम्नलिखित कोड के साथ अपने स्वयं के परीक्षण में, मैंने ध्यान दिया है कि कम से कम Shell एस स्वयं को निपटाने के रूप में रिपोर्ट करता है भले ही निपटान विधि को कभी भी मेरे कोड में कभी भी नहीं कहा जाता (न ही प्रकट होता है)।क्या मुझे स्पष्ट रूप से एसडब्ल्यूटी शैल का निपटान करने की आवश्यकता है?

import java.util.ArrayList; 
import java.util.List; 
import org.eclipse.swt.events.DisposeEvent; 
import org.eclipse.swt.events.DisposeListener; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 


    public class Test { 

     private static int numDisposals = 0; 
     private static List<Shell> shells = new ArrayList<Shell>(); 

    public static void main(String[] args) { 
     Display d = Display.getDefault(); 
     for (int i = 0; i < 3; i++) { 
      Shell s = new Shell(d); 
      shells.add(s); 
      s.setText(String.valueOf(i)); 
      s.open(); 
      s.addDisposeListener(new DisposeListener() { 

       @Override 
       public void widgetDisposed(DisposeEvent notUsed) { 
        numDisposals++; 
        printShellStatus(); 
       } 
      }); 
     } 
     while (numDisposals < 3) { 
      while (!d.readAndDispatch()) { 
       d.sleep(); 
      } 
     } 
     printShellStatus(); 
    } 

    public static void printShellStatus() { 
     System.out.println("Which shells are disposed?"); 
     for (Shell shell : shells) { 
      if (shell.isDisposed()) { 
       System.out.println("I am disposed."); 
      } else if (!shell.isDisposed()) { 
       System.out.println("I am NOT disposed."); 
      } 
     } 
    } 
} 

तो शैल को वास्तव में स्पष्ट रूप से निपटान करने की आवश्यकता है? यदि हां, तो आप कैसे जानते हैं कि शेल का निपटान कब किया जाए, और निपटान विधि कहां दिखाई देनी चाहिए?

उत्तर

13

paper है कि आप का हवाला देते हैं यह स्पष्ट करता है:

विजेट खुद को आम तौर पर प्रोग्राम के रूप में निपटारा करने के लिए जरूरत नहीं है। एक शेल और उसके बच्चों का निपटारा किया जाता है जब उपयोगकर्ता अपनी विंडो बंद कर देता है।

इसलिए जब एक खोल जरूरत नहीं निपटारा करने के लिए, बोझ नहीं पर आपको ऐसा करने की है। न ही आपको किसी भी बच्चे पर dispose पर कॉल करने की आवश्यकता है, क्योंकि माता-पिता का निपटान आपके लिए ऐसा करेगा। दोबारा, आपके द्वारा उद्धृत लिंक से:

जब आप शैल का निपटान करते हैं, तो उसके बच्चों का निपटारा किया जाता है। वास्तव में, किसी भी समग्र का निपटान सभी समग्र बच्चों का निपटान करेगा।

लेकिन, आप यह सुनिश्चित करें कि आप आपके द्वारा बनाए गए संसाधन है कि नहीं बच्चे हैं निपटाने बनाने के लिए नहीं है। उदाहरण के लिए: रंग और फोंट। आपको स्पष्ट रूप से अपनी निपटान विधि को कॉल करने की आवश्यकता है। Composite पर एक निपटान श्रोता को हुक करना सबसे अच्छा है, आप इसे करने के लिए इनका उपयोग कर रहे हैं। उदाहरण के लिए:

public class MyComposite extends Composite 
{ 
    private final Color color; 

    public MyComposite(Composite parent, int style) 
    { 
     super(parent, style); 

     color = new Color(getShell().getDisplay(), 255, 255, 255); 

     addDisposeListener(new DisposeListener() { 
      public void widgetDisposed(DisposeEvent e) 
      { 
       color.dispose(); 
      } 
     }); 
    } 
} 

यह नोट करना तथापि, महत्वपूर्ण है कि आप Color रों कि आप उपयोग लेकिन का निर्माण नहीं करतीं निपटान नहीं करना चाहिए। उदाहरण के लिए, Display#getSystemColor() से उपलब्ध सिस्टम रंगों का निपटान न करें।

+0

ग्रेट उत्तर, धन्यवाद। – Buttons840

संबंधित मुद्दे