Что делает эта конструкция Java? - PullRequest
8 голосов
/ 21 апреля 2010

Я новичок в java, поэтому терпите меня, если это нелепо простой вопрос, но мне любопытно, что этот вызов метода принимает {code} - см. Код ниже для примера в методе addSelectionListener. Какова цель этого? Я искал документы для объяснения, но, похоже, не могу найти то, что эта практика называется, не говоря уже о полезной информации.

    setStatusLine.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {

            String message = "I would like to say hello to you.";
            if (pressed) {
                message = "Thank you for using me";
            }
            setStatusLine(message);
            pressed = !pressed;
        }
    });

Спасибо за любую помощь или идеи, которые могут быть предложены

Ответы [ 5 ]

7 голосов
/ 21 апреля 2010

это анонимный класс , или анонимный внутренний класс. Если вы воспользуетесь Google для этого, вы найдете несколько учебников / примеров. У Sun тоже есть документы .

4 голосов
/ 21 апреля 2010

Как уже сказали другие участники: это анонимный класс

Вы могли бы создать новый класс с именем MyClass в новом файле с именем McClass.java, который выглядит так:

class MyClass extends SelectionAdapter {

  public void widgetSelected(SelectionEvent e) {
    <your code that's being executed whenever the widget is being selected>
  }

}

Тогда вы могли бы изменить первую строку следующим образом:

setStatusLine.addSelectionListener (new MyClass ());

См? Теперь у вас есть «явный» класс с одной функцией. Зачастую это слишком много и мешает вашему дизайну.

Это помогает?

3 голосов
/ 21 апреля 2010

Метод addSelectionListener получает экземпляр SelectionListener. Он не получает "код". Смущает использование new () {...}. Эта конструкция используется для анонимных внутренних классов . Фактически, код, приведенный выше, расширяет класс SelectionAdapter, переопределяет его метод widgetSelected, создает экземпляр нового класса и передает его addSelectionListener ().

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

2 голосов
/ 21 апреля 2010

На самом деле нет вызова метода ... Этот код устанавливает прослушиватель выбора для компонента setStatusLine.

Эквивалентом этого кода может быть

public class X implements SelectionListener{

    //In the constructor or an other method.
    setStatusLine.addSelectionListener(this);

    public void widgetSelected(SelectionEvent e) {

        String message = "I would like to say hello to you.";
        if (pressed) {
            message = "Thank you for using me";
        }
        setStatusLine(message);
        pressed = !pressed;
    }

}
0 голосов
/ 21 апреля 2010

Мне потребовалось некоторое время, чтобы понять анонимные внутренние занятия. Основные вещи, которые нужно запомнить:

Они похожи на параметры, за исключением того, что вместо передачи примитива или объекта, который вы передаете, в классе, который реализует интерфейс / расширяет класс (да, они также работают с интерфейсами) в зависимости от параметра метода. Они анонимны, поэтому «исчезают» сразу после выталкивания метода из стека. }); мертвая распродажа для анонимного внутреннего класса. Они часто всплывают в пользовательских интерфейсах для событий слушателя Они сохраняют беспорядок в вашем коде, но также затрудняют чтение.

Для полного наказания читайте JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

Если вы заинтересованы в знании мелочей о таких вещах, чтение книги SCJP и сдача экзамена - это хорошо, или вы можете изучать JLS. Он не научит вас программировать, но поможет вам понять, как работает Java и, в некотором смысле, многие другие ОО-языки.

...