2014-10-17 4 views
2

Вот простой пример:Есть ли название для этой структуры кода?

private final MouseAdapter mouse = new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      calculate(); 
     } 
    }; 

Это поле уровня класса, поэтому называть это анонимный класс не кажется правильным. Ни одно из других имен или описаний на странице «Учебники Oracle» по адресу Nested Classes, похоже, не соответствовало.

Я предполагаю, что это что-то вдоль линий «одноместного Object», но у меня трудное время, даже описывая его, не говоря что-то вроде «уровня Класса Названных анонимного класса»


Для тех, не знакомы с Java и AWT, я делаю экземпляр класса, который не имеет методов работы для реализации интерфейса для прослушивания действий мыши. Мне нужен фактический экземпляр, поэтому я могу добавить его как несколько типов слушателей (колесо, движение и щелчок), но использовать один и тот же объект для управления. Однако сам вопрос не является специфичным для AWT.

ответ

2

Это экземпляр анонимного класса, здесь нет необходимости искать новое имя.

Oracle docs От:

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

Он не говорит, что экземпляр должен использоваться только один раз, но только класс, поэтому нет никакого противоречия с вашим случаем.

+0

Отлично. Я никогда раньше не делал анонимного класса вне метода, поэтому он чувствовал себя супер странным в Java, но нормальным в JS. Я пропустил эту деталь в документах. – Eben

+1

Я выбрал это как ответ, потому что он очень непосредственно отвечает на мой вопрос и прекрасно указывает на то, на что я смотрел, но не читал достаточно правильно. Ответ @ kocko тоже очень хорош, и я бы хотел принять два ответа, так как вы оба заслуживаете этого. – Eben

+1

Это прекрасно @Eben. Простого upvote достаточно :) –

4

Давайте разделить ее на куски

  • private final MouseAdapter mouse называется класса члена в, какой тип (MouseAdapter) обозначает, что элемент может ссылаться на экземпляры и/или суб-классов MouseAdapter.

  • new MouseAdapter() { ... } называется анонимной реализации из MouseAdapter интерфейса/абстрактного класса.

Итак, подведем итоги: класс член mouse содержит ссылку на анонимный реализации MouseAdapter интерфейса/абстрактного класса.

+0

Хороший ответ. Для терминологии вы согласны с тем, что «анонимная реализация класса» такая же, как «анонимный класс», правильно? –

+0

Исправить. Они одинаковы, но с «анонимной реализацией класса» вы можете указать, какой именно класс реализован. –

1

Согласен с kocko's ответ, но хочу добавить одну вещь, которая,

Anonymous classes are expressions,, что означает, что вы определяете класс в другом выражении.

Так что независимо от того, где вы его объявляете, он останется анонимным классом и не нужно называть ваше заявление иначе. :)