Понимание слушателей событий в Java - PullRequest
3 голосов
/ 22 января 2011

Я новичок в Java, и все еще пытаюсь понять язык, поэтому я прошу прощения, если этот вопрос может звучать нудистски.

Что-то я не понимаю в слушателях, иногда вы можете видеть, что слушатель объявлен таким образом:

    private View.OnClickListener onSave=new View.OnClickListener() {
public void onClick(View v) {

// Some code

}

};

или

javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });

Больше всего меня смущает то, что точка с запятой и скобки после конца метода.

Я понимаю внутренние классы с целью иметь несколько слушателей, но я не понимаю этого смешанного объявления переменных и метода.

Какую цель это имеет?

Как это объявлено?

WTF? : P

ура :) 1019 *

Ответы [ 6 ]

3 голосов
/ 22 января 2011

Обычно определение класса, создание экземпляра и последующее использование этого экземпляра выполняется отдельно:

class MyListener extends OnClickListener {
    public void onClick(View v) {
        // my onClick code goes here
    }
}

MyListener foo = new MyListener();

button.setOnClickListener(foo);

Но иногда вам нужен подкласс, экземпляр которого вы создадите сразу один раз, что часто имеет место для обработчиков событий. Его удобно определить и создать вместе, используя анонимный (внутренний) класс:

OnClickListener foo =
    new OnClickListener() {
        public void onClick(View v) {
            // my onClick code goes here
        }
    };

button.setOnClickListener(foo);

Но поскольку foo используется только один раз, мы можем сделать еще один шаг и исключить локальную переменную foo, поэтому:

button.setOnClickListener(foo);

можно отформатировать как:

button.setOnClickListener(
    foo
);

подставьте в значение foo:

button.setOnClickListener(
    new OnClickListener() {
        public void onClick(View v) {
            // my onClick code goes here
        }
    }
);

переформатировал снова без какого-либо большого пробела, чтобы увидеть это, как это часто пишется:

button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        // my onClick code goes here
    }
});

Я думаю, что последний формат ухудшает читабельность. Я форматирую свои анонимные классы аналогично тому, как это происходит в последнем формате - лучшая читаемость (ИМХО) стоит немного лишних пробелов.

2 голосов
/ 22 января 2011

Здесь нет ничего недоумения по поводу точки с запятой или скобок.По сути, это один из способов назначить анонимный класс в Java.Если вы не привыкли к этой конструкции, вы, безусловно, можете создать свой собственный класс, который реализует Runnable, и назначить его следующим образом: -

public class YourRunnableClass implements Runnable {
   public void run() {
      ...
   }
}

Затем вы можете сделать его более приятным, например: -

javax.swing.SwingUtilities.invokeLater(new YourRunnableClass());

P / S: старайтесь не использовать "WTF" в своем посте.:)

2 голосов
/ 22 января 2011

Break it down ...

javax.swing.SwingUtilities.invokeLater(Runnable runnable);

invokeLater() - это статический метод для SwingUtilities, который принимает Runnable в качестве параметра.

Обратите внимание на правильную скобкуточка с запятой в конце;это просто стандартный метод, верно?

Посредине просто создается новый экземпляр Runnable для передачи в метод.Вы лучше узнаете, если я назначу ссылку:

Runnable parameter = new Runnable() 
{
    public void run() 
    {
        createAndShowGUI();
        }
    }
};
1 голос
/ 22 января 2011

Я попытаюсь проиллюстрировать второй пример.

В этом случае метод invokeLater ожидает любой объект, который реализует Runnable интерфейс.

например, это альтернативный способ написать то же самое без анонимного класса:

class Example implements Runnable{
  public void run(){
    // do something
  }
}

и ваш пример может быть:

javax.swing.SwingUtilities.invokeLater(new Example());

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

1 голос
/ 22 января 2011

Этот код применяется анонимные классы . Ищите и читайте эту тему.

Точка с запятой завершает присваивание соответственно вызову метода.

PS. Я всегда думал, что имя что-то вводит в заблуждение, потому что то, что вы действительно получаете, это Объект.

1 голос
/ 22 января 2011

Это анонимный внутренний класс . Это очень распространенная и удобная конструкция. Прочитайте учебник, на который я ссылаюсь!

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