Что делает этот код (когда-либо видел объект без ссылочной переменной? Как насчет вызова объекта позже без ссылочной переменной?)? - PullRequest
0 голосов
/ 05 августа 2009
EventQueue.invokeLater(new Runnable()
  {
     public void run()
        {
           ZipTestFrame frame = new ZipTestFrame();
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setVisible(true);
        }
  });

Ответы [ 2 ]

9 голосов
/ 05 августа 2009

Этот код создает экземпляр анонимного класса, реализующего runnable. Этот объект передается в качестве аргумента в EventQueue.invokeLater, который вызовет его позже (это означает, что он вызовет метод run для этого объекта в какой-то более поздний момент времени).

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

Добавление:

Примитивный пример того, как может выглядеть простая очередь событий:

class MyEventQueue {
    Queue<Runnable> queue = new LinkedList<Runnable>();
    public void invokeLater(Runnable r) {
        queue.add(r);
    }
    public boolean hasNext() {
        return !queue.isEmpty();
    }
    public void processNext() {
        queue.poll.run();
    }
}
0 голосов
/ 05 августа 2009

Вот как выглядит событие:

class Event { 
    Runnable RunnableObject; 
    public void invokeLater(Runnable runner) { 
        RunnableObject = runner; 
    }
    /* background thread */ 
    public void thread() { 
        while ( condition ) { 
            if ( itsLater ) { 
               RunnableObject->run();
            }
        }
     }
 }

За фасадом Event выполняется асинхронный метод, который принимает анонимный объект, который вы передали invokeLater, и вызывает его метод run (). Объект все еще существует, у него есть определение, но у него нет ссылки, которую вы можете использовать для последующего его опроса, если только вы не используете метод run () для передачи указателя this чему-то другому.

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