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

0

Разрешается объявлять вложенные классы внутри блоков кода, таких как тело метода, конструктор или блок инициализации. Подобный локальный внутренний класс (local inner class) не является членом класса, к которому относится блок, а принадлежит самому блоку – точно так же, как обычная локальная переменная. Такие классы совершенно недоступны за пределами внешнего класса, поскольку нет никаких способов обращения к ним, но их экземпляры – это обычные объекты, которые позволяется, например, передавать в качестве аргументов или возвращать из методов. Объект локального внутреннего класса "живет" до тех пор, пока существует хотя бы одна ссылка на него. Единственный модификатор, который допускается применять в объявлении локального класса, – это final, предотвращающий, как обычно, возможность расширения класса.

Код локального внутреннего класса обладает правом доступа ко всем переменным, принадлежащим контексту того же блока, – локальным переменным, параметрам метода, переменным экземпляра (в предположении, что блок не статический) и статическим переменным. Единственное ограничение состоит в том, что локальная переменная или параметр метода становятся доступными, если только они помечены признаком final. Причина введения подобного ограничения обусловлена большей частью проблемами поддержки многопоточных приложений (подробная информация приведена в главе 10), когда необходимо гарантировать, что все переменные, на которые "покушается" код соседнего локального внутреннего класса, инициализированы устойчивыми предсказуемыми значениями. Если необходимо, вы вправе загодя скопировать значение переменной нe-final в соответствующее поле final – до того момента, когда к нему Сможет обратиться код локального внутреннего класса.

Рассмотрим стандартный интерфейс Iterator, объявленный в пакете java.util. Интерфейс определяет способ просмотра группы объектов. Обычно он используется для упорядочения доступа к элементам контейнерного объекта, Но может быть применен также и для поддержки любого процесса итерации:

package java.util;

public interface Iterator {

boo1ean hasNext();

Object next() throws NosuchElementException;

void remove() throws NosuchElementException;

}

 

 

Метод hasNext возвращает значение true, если существуют объекты, которые могут ь возвращены методом next. Метод remove удаляет последний элемент, полученный посредством next. Исключение типа NoSuchElementException – он так входит в состав пакета java.util – выбрасывается, если метод next не находит ходящих элементов либо метод remove вызывается еще до первого выполнения next. За подробностями обращайтесь к разделу 16.2 на странице 438.

Ниже приведен текст простого метода, который возвращает экземпляр типа rator, позволяющий просматривать массив объектов.

public static Iterator walkThrough(final Object[] objs) {

class Iter implements Iterator {

private int pos = о;

public boolean hasNext() {

return (pos < objs.length);

}

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

throw new NoSuchElementException();

return objs[pos++];

}

publie void remove() {

throw new UnsupPortedOperationException();

}

}

return new Iter();

Класс Iter локален по отношению к методу walkThrough и не является членом внешнего класса. Код класса Iter обладает правами доступа ко всем переменным , объявленным в теле метода, в частности к параметру objs. В составе класса явлено поле pos, предназначенное для хранения текущего значения индекса массива objs. (Подразумевается, что в файле с исходным текстом, где расположено явление метода walkThrough, имеется инструкция импорта интерфейса Iterator и класса NoSuchElementException из пакета java.util.)

члены локальных внутренних классов способны перекрывать одноименные локальные переменные и параметры, объявленные в том же блоке, точно так

как поля и методы экземпляра. Но правила, о которых мы говорили в разе 5.2.3 на странице 145, применимы во всех случаях. Единственное отличие состоит в том, что коль скоро локальная переменная или параметр оказались скрыты, способов обращения к ним больше не существует.

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

По теме:

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