2012-06-12 4 views
3

Прошло несколько лет с тех пор, как я был сильно вовлечен в Java. Возвращаясь к этому, я вижу эту картину повсюду:Создание объекта Java с переданным методом

ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 
    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
    // do work 
    } 
}); 

Это больше похоже на Функциональное программирование для меня. Это хороший образец, но как можно передать такой метод? Раньше класс был классом, и когда-то он был скомпилирован, вы могли бы сделать это.

Мои вопросы:

  1. Может кто-нибудь, дайте мне знать, что называется эта картина?
  2. Как написать класс, который может быть создан таким образом.
  3. Есть ли другие полезные примеры функциональных шаблонов, которые пробились на Java?
  4. Что мне нужно для Google, чтобы узнать больше об этом?

Спасибо.

ответ

9

Это проходит анонимный класс, а не метод.

Это типичный образец, а не только в программировании Swing, но где угодно (надеюсь) короткие, «отбрасывающие» реализации интерфейса или класса, которые не нужно повторно использовать, вместо того, чтобы создавать полномасштабная реализация.

Любой класс/интерфейс может быть реализован, как это, нет ничего особенного:

public interface Foo { 
    String foo(); 
} 

...

public class Main { 
    public static void main(String[] args) { 
     System.out.println(new Foo() { 
      public String foo() { 
       return "plugh"; 
      } 
     }); 
    } 
} 

Анонимные внутренние классы получают свои собственные файлы классов, тоже, несмотря на то, их источник встроен.

В этом примере создается файл Main$1.class для анонимного внутреннего класса в дополнение к ожидаемому файлу Main.class.

+1

«Анонимный внутренний класс», чтобы быть педантичным :-) Для OP они были частью Java с самого начала. –

+0

Ah, а onRatingChanged - статический метод. Спасибо за вашу помощь, теперь я чувствую себя довольно глупо :) – superluminary

+0

@superluminary Нет, это не статический метод - если бы это было так, у него было бы ключевое слово 'static'. Плюс статические методы не являются переопределяемыми, просто закрывающимися. –

1

Заявление: new OnRatingBarChangeListener() создает новый экземпляр класса. Следующая часть внутри фигурных скобок - это определение класса.

В этом случае этот класс в анонимном классе, который реализует именованный интерфейс.

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

Этот шаблон очень распространен при использовании прослушивателей, которые часто содержат только один-несколько методов, которые выполняют почти тривиальную задачу.

0

Это шаблон приемника. Строка рейтинга принимает реализацию OnRatingBarChangeListener и вызывает ее метод onRatingChanged на соответствующем событии.

Вы можете использовать экземпляр любого класса, который реализует OnRatingBarChangeListener. Таким образом, вы можете использовать либо свой собственный класс, либо вы можете передать ему анонимный класс, как в примере. Анонимный класс в примере фактически является неназванным классом, который расширяет Object и реализует OnRatingBarChangeListener.Поскольку класс не назван, он не может ссылаться, и поэтому переданный экземпляр является единственным экземпляром, существующим.

0

Это называется «шаблон наблюдателя». Хорошим примером этого является добавление слушателей действий для кнопки java или другого компонента. Например,

myButton.addActionListener(
       new java.awt.event.ActionListener() 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        //Work here 
       } 
      }); 

Здесь «myButton» является объектом, а ActionListener является наблюдателем.

+0

ИМО, не обсуждая корневой характер происходящего, по крайней мере, несколько пропускает точку OP - показывая практически идентичный пример, на самом деле ничего не помогает объяснить. –

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