2012-01-05 21 views
5

Neden SWING bazı belirli nesneleri final olarak işaretlemek için beni zorlar? Bu bazen işleri biraz zorlaştırdığından, bundan kaçınmanın bir yolu var mı?Salıncak ve son değiştirici

nihai olarak IExchangeSource değişkeni işaretlemek için beni zorlar (EKSİK ÖRNEK):

Bu Swing ile yapılacak şey, hiç ilgisi
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

Bir örnek verebilir misiniz? Anonim bir iç sınıftaki bir çevreleyen yöntemden değişkenler kullanmaktan mı bahsediyorsunuz? Çünkü Swing'in kendisinde, 'final' değişkenlerini yapmaya zorlayan hiçbir şey yoktur. – Jesper

+2

İddiaya göre anonim iç sınıf kullanıyorsunuz. –

cevap

18

. Bunun bir örneğini gösteren kodunuzu göstermelisiniz, ancak muhtemelen bir iç sınıf, muhtemelen bir anonim iç sınıf kullanıyorsunuzdur ve bunları kullanır ve iç sınıftaki değişkenleri bir kapsayıcı yönteme yerel olarak kullanmaya çalışırsanız (veya Bir kurucu gibi diğer blok), sonra bu değişkenleri nihai hale getirmek veya onları sınıf alanlarına tanıtmak için requried edilir. Yine bu Java gereksinimi, Salıncak gereksinimidir.

Bir Salıncak örnek:

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

ve Sigara Salıncak örnek:

  • bir sınıf alanına değişkeni tanıtın:

    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(); 
    } 
    

    Bunu önlemek için çeşitli hileler vardır sınıf kapsamı veriyor.

  • Adsız iç sınıfın dış sınıfın yöntemini çağırmasını sağlayın. Ama sonra, değişkenin hala sınıf kapsamına sahip olması gerekecek.

Düzenleme 2 Anthony Accioly büyük bağlantı içeren bir yanıt gönderdiniz, ama sonra bilinmeyen nedenlerle onun cevabını silindi. Buradaki bağlantısını yayınlamak istiyorum, ancak cevabını tekrar açtığını görmek isterim.

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

+0

Cevabınız için teşekkürler ve evet bir iç sınıf kullanıyordum (örneğe bakınız). İlk başta bir örnek eklemediğim için üzgünüm. – Cemre

+0

@Cemre: lütfen bkz. Çözümler için düzenle –

+0

@Cemre, örnek göndermediğin için ne demek istiyorsun? Geçmişte sorunuzu bir SSCCE göndermek için sorulmuştunuz. Her soruya bir SSCCE eklenmelidir. – camickr

İlgili konular