2010-04-21 2 views
8

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

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

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

+4

Анонимные классы снова забастовку! Нельзя винить людей за то, что они не смогли найти ссылку на то, что они не знают названия ... –

+5

«Я новичок в java, так голый со мной ...» - Держу пари, вы говорите, что ко всем Ребята :-) –

+0

Я боролся с ними, когда я тоже начал изучать Java :) – Skurmedel

ответ

7

это Anonymous Class или анонимный внутренний класс. Если вы Google для этого, вы найдете некоторые tutorials/examples. Вс has some docs тоже.

+0

Спасибо за помощь, ребята, очень ценятся. – BandyOrc

2

Фактически нет вызова метода ... Этот код устанавливает прослушиватель выбора для компонента 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; 
    } 

} 
3

Метод addSelectionListener получает экземпляр SelectionListener. Он не получает «код». Запутанным является использование нового класса </имя интерфейса>() {...}. Эта конструкция используется для anonymous inner classes. На самом деле то, что делает вышеописанный код, расширяет класс SelectionAdapter, переопределяя его метод widgetSelected, создавая экземпляр нового класса и передавая его в addSelectionListener().

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

4

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

Вы могли бы создать новый класс с именем 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 (новый MyClass());

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

Помогло ли это?

0

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

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

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

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

Смежные вопросы