У меня есть библиотека, которая была изменена, чтобы ввести фабричный метод для замены конструктора (причины сейчас не важны, в данном случае в основном это было для улучшенного вывода типов).
Предполагая, что существует сценарий рефакторинга Eclipse для него (так что у меня есть хорошее машиночитаемое описание изменения), есть ли способ применить этот сценарий в проект, который только использует эту библиотеку (т. е. имеет ссылку только на скомпилированную версию библиотеки)?
Например, я начинаю с этого простого класса:
public class MyContainer {
private final T content;
public MyContainer(final T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
Теперь я представляю factory (не делая конструктор закрытым, но сейчас это не актуально), метод factory выглядит так:
public static MyContainer holding(T content) {
return new MyContainer(content);
}
Теперь, когда я экспортирую сценарий миграции, он выглядит так:
Это должно содержат достаточно информации, чтобы применить рефакторинг к другому проекту, который ссылается на ( текущую версию) класса через файл jar.
Но попытка применить рефакторинг дает мне эту ошибку:
Реорганизация 'Introduce Factory' (org.eclipse.jdt.ui.introduce.factory) не может быть выполнена, так как его ввод 'scratch.MyContainer.java' не существует.
Обратите внимание, что явно упоминает .java
, поэтому он ищет исходный файл и не удовлетворяется применением рефакторинга к двоичному типу.
Примечание: Я не хочу исправлять двоичную библиотеку. Я просто хочу, чтобы вызывающие исходного конструктора вместо этого преобразовывались в вызов фабричного метода.
Примечание 2: Поиск и замена не помогут в моем конкретном случае. Причина в том, что у меня есть два конструктора, один принимает объект
, а другой принимает String
. Они должны быть сопоставлены с двумя разными фабричными методами, поэтому мне понадобится функция поиска и замены, чтобы также просматривать информацию о типе аргумента.
Примечание 3: будет оценен даже способ вручную указать «заменить экземпляры объекта X
этим конструктором вызовами этого метода».
Обновление: В bugzilla Eclipse есть запись bugzilla о добавлении рефакторинга вызова замены . Реализация этой функции могла бы решить мою проблему, если «вызов» включает создание экземпляра объекта через данный конструктор. К сожалению, в последние несколько лет он не проявлял активности (хотя это было запланировано на 3.2).