Главная » Java » Анонимные внутренние классы

0

Когда кажется, что без использования локального внутреннего класса просто обойтись, можно объявить анонимный (безымянный) класс (anonymous inner s), способный расширить другой класс или реализовать интерфейс. Объявления такого класса выполняется одновременно с получением его объекта посредством оператора new. Рассмотрим для примера тот же метод walkThrough, что и предыдущем разделе. Класс Iter достаточно специфичен и совершенно бесполезен за пределами метода walkThrough. Имя класса Iter вряд ли придает коду

дополнительный смысл – важно только то, что возвращается объект типа Iterator. Текст метода walkThrough можно переписать, используя конструкцию объявления анонимного класса:

publiс statiс Iterator walkThrough(fina1 objeсt[] objs) { return new Iterator() {

private int pos = о;

                publiс boolean hasNext() {                                                                 I

return (pos < objs.length); }

public Object next() throws NoSuchElementException { if (pos >= objs.length)

throw new NoSuchElementException(); return objs[pos++];

}

public void remove() {

throw new UnsupPortedOperationException(); }

};

}

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

В составе анонимного класса не разрешается объявлять конструкторы, поскольку не существует имени, которым можно было бы их снабдить. Если задача, решаемая классом, сложна и все-таки требует наличия конструкторов, вероятно, целесообразно прибегнуть к модели локального внутреннего класса. Большинство анонимных классов, используемых на практике, обычно не нуждается в серьезной инициализации. Впрочем, те значения, которые следовало бы передавать в виде аргументов конструкторов, всегда можно разместить в соответствующих выражениях и блоках инициализации – применение таких средств в составе анонимного класса вполне допустимо. Единственная проблема стадии конструирования, которая в этой ситуации все еще заслуживает особого внимания, связана с необходимостью явного вызова конструктора базового класса. Она решается оператором new, обеспечивающим корректный вызов такого конструктора. Вернемся к примеру класса Attr, рассмотренному в разделе 3.1 на странице 88, и дополним его объявлением анонимного производного класса, который вызывает конструктор Attr с одним аргументом и переопределяет метод SetValue, обеспечивая вывод на экран нового значения атрибута:

Attr name = new Аttr("имя") {

public Object setValue(Object nv) { Sуstеm.оut.рrintln("значение изменено на " + nv);

return super.setValue(nv);

}

} ;

Обратите внимание, что в примере метода walkThrough неявно вызывался Конструктор без параметров класса Object – это единственный конструктор,

который может быть использован, если анонимный класс относится к интерфейсному типу.

Анонимные классы, обычно простые и достаточно прямолинейные, способны легко превратиться в предмет, недоступный для понимания. Чем выше степень их вложенности, тем труднее их воспринимать и использовать. Представьте ситуацию: код анонимного класса, который должен выполняться позже, расположен в теле метода, работающего в данный момент, – это потенциальный источник недоразумений. Вероятно, следует избегать использования анонимных классов, объем которых превышает 6-8 строк кода, и обращаться к ним только в самых простых случаях. Мы обошли это правило в примере walkThrough только потому, что единственная задача этого метода – возврат объекта; но если Метод, как предусматривается, должен выполнять много различных функций, следует создавать небольшие анонимные классы, позволяющие сохранять удобочитаемость кода и возможность его развития. Модель анонимных классов, используемая правильно и по назначению, – это хорошее средство описания простых вещей простым языком. В противном случае она способна создавать непостижимые и непреодолимые проблемы.

 

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии