Статьи

Преобразование вложенных / анонимных классов в классы верхнего уровня с использованием Eclipse Refactoring

Вложенные классы , например. анонимные классы часто более удобны, чем создание отдельных классов, особенно при работе с чем-то вроде шаблона 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. Сначала убедитесь, что вы создали именованный вложенный класс (шаги 1-3).
  2. Скопируйте и вставьте соответствующие закрытые поля включающего класса во вложенный класс.
  3. Автоматически генерировать конструктор для вложенного класса на основе только что скопированных полей ( Alt + Shift + S, O ).
  4. Перейдите к ошибке конструктора ( Ctrl +. ), Где создается вложенный класс, и добавьте поля в конструктор.

Самый простой способ увидеть, как это работает, — посмотреть следующее видео. В этом примере я передам имя поля и адрес новому классу,

От http://eclipseone.wordpress.com/2010/07/21/convert-nestedanonymous-classes-into-top-level-classes-using-eclipse-refactoring/