2012-01-05 25 views
5

Tại sao SWING luôn buộc tôi đánh dấu một số đối tượng cụ thể là cuối cùng? Vì điều này đôi khi làm cho mọi thứ trở nên khó khăn một chút, Có cách nào để tránh điều này không?Đu và sửa đổi cuối cùng

(INCOMPLETE VÍ DỤ), nơi nó buộc tôi để đánh dấu sự biến IExchangeSource như thức:

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

Bạn có thể đưa ra ví dụ không? Bạn đang nói về việc sử dụng các biến từ một phương thức xung quanh trong một lớp bên trong vô danh? Bởi vì không có gì trong Swing chính nó thực thi bạn để tạo các biến 'final'. – Jesper

+2

Tôi đặt cược rằng bạn đang sử dụng lớp bên trong vô danh. –

Trả lời

18

này có để làm với Swing, không có gì cả. Bạn sẽ hiển thị mã của bạn có một ví dụ về điều này, nhưng có thể bạn đang sử dụng một lớp bên trong, có thể là một lớp bên trong vô danh, và nếu bạn sử dụng chúng và cố gắng sử dụng các biến bên trong lớp bên trong. khối khác, chẳng hạn như hàm tạo), sau đó bạn được yêu cầu để tạo các biến này cuối cùng hoặc quảng bá chúng thành các trường lớp. Một lần nữa đây là yêu cầu Java, không phải yêu cầu Swing.

Một ví dụ Swing:

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

và một ví dụ Non-Swing:

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

Có một vài thủ thuật để tránh điều này:

  • Thúc đẩy việc biến một trường lớp , cho nó phạm vi lớp.
  • Yêu cầu lớp bên trong ẩn danh gọi phương thức của lớp ngoài. Nhưng sau đó, biến sẽ vẫn cần phải có phạm vi lớp.

Chỉnh sửa 2 Anthony Accioly đăng một câu trả lời với một liên kết tuyệt vời, nhưng sau đó không rõ lý do xóa câu trả lời của mình. Tôi muốn đăng liên kết của anh ấy ở đây, nhưng rất thích nhìn thấy anh ta mở lại câu trả lời của anh ấy.

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

+0

Cảm ơn câu trả lời và có tôi đã sử dụng một lớp bên trong (xem ví dụ). Xin lỗi vì không thêm ví dụ lúc đầu. – Cemre

+0

@Cemre: vui lòng xem chỉnh sửa cho các giải pháp –

+0

@Cemre, bạn cảm thấy tiếc khi không đăng một ví dụ? Bạn đã được yêu cầu trong quá khứ đăng một SSCCE với câu hỏi của bạn. SSCCE phải được bao gồm trong mọi câu hỏi. – camickr

Các vấn đề liên quan