2012-01-05 20 views
5

क्यों स्विंग हमेशा मुझे कुछ विशेष वस्तुओं को अंतिम रूप में चिह्नित करने के लिए मजबूर करता है? चूंकि यह कभी-कभी चीजों को थोड़ा मुश्किल बनाता है, क्या इससे बचने का कोई तरीका है?स्विंग और अंतिम संशोधक

(INCOMPLETE उदाहरण) जहां यह मुझे मजबूर करता अंतिम रूप IExchangeSource चर चिह्नित करने के लिए:

public class MainFrame { 

private final JTextArea textArea = new JTextArea(); 


public static void main(final IExchangeSource s) { 
    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      new MainFrame(s); 
     } 
    }); 
} 
public MainFrame(final IExchangeSource s) { 
    //build gui 
    s.update(); 
+3

क्या आप एक उदाहरण दे सकते हैं? क्या आप किसी अज्ञात आंतरिक कक्षा में आस-पास की विधि से चर का उपयोग करने के बारे में बात कर रहे हैं? क्योंकि स्विंग में कुछ भी नहीं है जो आपको 'अंतिम' चर बनाने के लिए मजबूर करता है। – Jesper

+2

मुझे यकीन है कि आप अनाम आंतरिक कक्षा का उपयोग कर रहे हैं। –

उत्तर

18

यह कुछ भी नहीं स्विंग के साथ क्या करना, कुछ भी नहीं है। आपको अपना कोड दिखाना चाहिए जिसमें इसका एक उदाहरण है, लेकिन संभवतः आप एक आंतरिक वर्ग, संभवतः एक अज्ञात आंतरिक वर्ग का उपयोग कर रहे हैं, और यदि आप इनका उपयोग करते हैं और आंतरिक कक्षा के अंदर चर का उपयोग करने का प्रयास करते हैं जो स्थानीय रूप से एक संलग्न विधि (या अन्य ब्लॉक जैसे कि कन्स्ट्रक्टर), फिर आपको इन चर को अंतिम बनाने या कक्षा क्षेत्रों में प्रचारित करने के लिए पुन: उपयोग किया जाता है। फिर यह जावा आवश्यकता है, स्विंग आवश्यकता नहीं है।

एक स्विंग उदाहरण:

public MyConstructor() { 
    final int localIntVar = 3; // this must be final 

    myJButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     // because you use the local variable inside of an anon inner class 
     // not because this is a Swing application 
     System.out.println("localIntVar is " + localIntVar); 
     } 
    }); 
} 

और एक गैर-स्विंग उदाहरण:

  • एक वर्ग क्षेत्र के लिए चर का प्रचार करें:

    public void myMethod() { 
        final String foo = "Hello"; // again it must be final if used in 
               // an anon inner class 
    
        new Thread(new Runnable() { 
         public void run() { 
         for (int i = 0; i < 10; i++) { 
          System.out.println(foo); 
          try { 
          Thread.sleep(1000); 
          } catch (Exception e) {} 
    
         } 
         } 
        }).start(); 
    } 
    

    कई चालें इस से बचने के लिए कर रहे हैं , इसे कक्षा का दायरा दे रहा है।

  • अज्ञात भीतरी कक्षा बाहरी कक्षा का एक तरीका है। लेकिन फिर, परिवर्तनीय को अभी भी कक्षा के दायरे की आवश्यकता होगी।

संपादित 2 एंथोनी Accioly एक महान लिंक के साथ एक उत्तर पोस्ट किया है, लेकिन फिर अज्ञात कारणों के लिए अपने उत्तर हटा दिया गया। मैं यहां अपना लिंक पोस्ट करना चाहता हूं, लेकिन उसे अपने जवाब को फिर से खोलना अच्छा लगेगा।

Cannot refer to a non-final variable inside an inner class defined in a different method

+0

उत्तर के लिए धन्यवाद और हाँ मैं एक आंतरिक वर्ग का उपयोग कर रहा था (उदाहरण देखें)। पहले उदाहरण जोड़ने के लिए खेद है। – Cemre

+0

@Cemre: कृपया समाधान के लिए संपादन देखें –

+0

@Cemre, उदाहरण पोस्ट करने के लिए आपको क्या खेद है? आपसे पहले से ही आपके प्रश्न के साथ एक एसएससीसीई पोस्ट करने के लिए कहा गया है। प्रत्येक प्रश्न के साथ एक एसएससीसीई शामिल किया जाना चाहिए। – camickr

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