Вложенные классы , например. анонимные классы часто более удобны, чем создание отдельных классов, особенно при работе с чем-то вроде шаблона Command или прослушивателей событий. Например:
JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ... Do something useful
}
});
Но наступает момент, когда вложенный класс становится настолько громоздким, что код становится нечитаемым. И иногда вы хотите повторно использовать тот же класс в другом месте — что трудно с анонимными внутренними классами.
Ответ будет состоять в том, чтобы изменить вложенный класс в открытый класс верхнего уровня (или гражданина первого класса, если хотите), который существует в его собственном файле (например, SomethingUsefulActionListener.class ). Но выполнение этого вручную может занять много времени и подвержено ошибкам.
В Eclipse есть несколько рефакторингов и быстрых исправлений, которые помогают сделать работу намного проще. Преобразование анонимного внутреннего класса в класс верхнего уровня требует только двух рефакторингов и займет у вас пару секунд вместо минут. (Именованный) внутренний класс требует только одного рефакторинга. И передача аргументов новому классу также проста, если вы используете некоторые из быстрых исправлений Eclipse.
Преобразуйте анонимный внутренний класс в верхний уровень
Преобразование анонимного внутреннего класса в класс верхнего уровня требует 2 основных рефакторинга: преобразовать его во вложенный класс и затем преобразовать вложенный класс в класс верхнего уровня. Если у вас есть вложенный класс (т.е. именованный внутренний класс), просто начните с шага 4.
Вот инструкции, но ниже также есть видео с быстрым примером.
1. Преобразуйте анонимный внутренний класс во вложенный класс, стоя на конструкторе анонимного класса и выбрав Refactor> Преобразовать анонимный класс во вложенный… (или Alt-T, O ). Появится диалоговое окно с запросом сведений о вложенном классе.
2. Введите имя для нового вложенного класса, выберите public в качестве видимости и отмените выбор. Объявить вложенный тип как окончательный .
3. Нажмите Ok. Eclipse создаст новый вложенный класс внутри включающего класса и оставит вызов конструктора там, где раньше был объявлен анонимный класс.
4. Теперь преобразуйте вложенный класс в класс верхнего уровня, стоя на имя класса и выбрав Refactor> Преобразовать тип элемента в Верхний уровень… (или Alt-T, V ). Появится диалоговое окно с предложением ввести имя экземпляра.
5. (Необязательно) Если вы хотите получить доступ к включающему классу в вашем новом классе, введите имя для поля, которое будет назначено этому классу. Я обычно оставляю это поле пустым.
6. Нажмите ОК. Eclipse создаст новый класс ( UsefulAction.class ) и переместит его в новый файл в том же пакете.
Вот короткое видео, чтобы показать вам, как это легко. В этом примере мы переведем анонимный внутренний ActionListener класс к классу называется UsefulAction.class .
Передача аргументов из включающего класса в новый класс
А как насчет того, когда вложенный класс обращается к полям во включающем классе? Как легко получить приватные поля из включающего класса в новый класс верхнего уровня?
Нет единственного способа сделать это, но есть методы, чтобы сделать это немного быстрее. Один трюк заключается в следующих шагах:
- Сначала убедитесь, что вы создали именованный вложенный класс (шаги 1-3).
- Скопируйте и вставьте соответствующие закрытые поля включающего класса во вложенный класс.
- Автоматически генерировать конструктор для вложенного класса на основе только что скопированных полей ( Alt + Shift + S, O ).
- Перейдите к ошибке конструктора ( Ctrl +. ), Где создается вложенный класс, и добавьте поля в конструктор.
Самый простой способ увидеть, как это работает, — посмотреть следующее видео. В этом примере я передам имя поля и адрес новому классу,