Свинг и финальный модификатор - PullRequest
5 голосов
/ 05 января 2012

Почему SWING всегда заставляет меня отмечать некоторые конкретные объекты как финальные?Так как это иногда усложняет ситуацию, есть ли способ избежать этого?

(НЕПРАВИЛЬНЫЙ ПРИМЕР), где он заставляет меня помечать переменную IExchangeSource как final:

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

1 Ответ

18 голосов
/ 05 января 2012

Это не имеет ничего общего с Swing, вообще ничего.Вы должны показать свой код, который имеет пример этого, но, вероятно, вы используете внутренний класс, возможно, анонимный внутренний класс, и если вы используете их и пытаетесь использовать переменные внутри внутреннего класса, которые являются локальными для включающего метода (илидругой блок (например, конструктор), тогда вам необходимо сделать эти переменные окончательными или преобразовать их в поля класса.Опять же, это требование Java , а не требование Swing .

Пример 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);
      }
   });
}

и пример без 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();
}

Существует несколько приемов, позволяющих избежать этого:

  • Повышение переменной до поля класса, предоставляя ему область видимости класса.
  • Иметь анонимный внутренний классвызовите метод внешнего класса.Но тогда переменная все равно должна иметь область видимости класса.

Edit 2 Anthony Accioly опубликовал ответ с отличной ссылкой, но затем по неизвестным причинам удалил свой ответ.Я хотел бы опубликовать его ссылку здесь, но хотел бы, чтобы он снова открыл свой ответ.

Невозможно сослаться на непоследнюю переменную внутри внутреннего класса, определенного в другом методе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...