Автоматическое генерирование реализации не общего интерфейса
У меня есть интерфейс
public interface ObjectBuilder<E> {
E buildObject();
}
Кроме того, в проекте есть много классов, которые реализуют не общую версию интерфейса.
class MyClassBuilder implements ObjectBuilder {
public MyClass buildObject() {/**/}
}
Возможно ли автоматическое преобразование всех этих классов, чтобы они реализовали общую версию интерфейса?
автоматический рефакторинг:
class MyClassBuilder implements ObjectBuilder<MyClass> {
public MyClass buildObject() {/**/}
}
Есть ли встроенный или подключаемый модуль Intellij IDEA? Или в другой среде IDE?
Ответы
Ответ 1
Что бы я сделал: искать implements ObjectBuilder
и автоматически заменять все вхождения тем, что не компилируется, например
implements ObjectBuilder<FIXME>
Затем попытайтесь скомпилировать и вручную исправить все перерывы. Вероятно, это будет быстрее, чем использовать более продвинутый метод...
Ответ 2
Вы можете использовать Функция структурного поиска и замены. Тем не менее, он доступен только в Ultimate.
Ответ 3
NetBeans предлагает функцию Inspect and Transform, которая позволяет писать пользовательские проверки и преобразования:
<source-pattern> :: <conditions>
=> <target-pattern> :: <conditions>
;;
Например:
$f.toURL() :: $f instanceof java.io.File
=> $f.toURI().toURL()
;;
Вы можете найти больше примеров таких преобразований в сообщении в блоге.
Аналогично, IntelliJ поддерживает собственные правила преобразования кода с помощью функции Структурный поиск и замена. Используя эту функцию IntelliJ, вы можете сделать преобразования следующим образом:
class $TestCase$ extends TestCase {
$MyClassContent$
}
=>
class $TestCase$ extends OurHomeGrownTestCase {
$MyClassContent$
}
Однако я не уверен, что вышеприведенные языки правил достаточно выразительны, чтобы поддерживать желаемое преобразование. Если они не могут выразить ваше преобразование, вы всегда можете прибегнуть к API рефакторинга IDE для автоматизации вашего пользовательского преобразования, например:
Ответ 4
Вам, вероятно, будет интересно Системы преобразования программ.
Такие инструменты позволяют указывать изменения кода в терминах шаблонов исходного кода: "если вы видите это, а затем замените его на это". (Это похоже на программируемый "структурный поиск и замену", упомянутый в другом ответе). Более сильные инструменты в этой категории предоставляют информацию о типах ( "таблицах символов" ) и делают доступными для управления преобразованиями (вы, безусловно, нуждаетесь в этом, потому что вас интересует только применение изменений к объектам, связанным с определенным интерфейсом.)
Такие инструменты также позволяют метапрограммировать последовательность действий таких преобразований. С этими двумя идеями можно реализовать инструменты для проведения "массовых" изменений, таких как вид, который вы созерцаете.
Ответ 5
Возможно ли автоматическое преобразование всех этих классов, чтобы они реализовали общую версию интерфейса?
Да, возможно, для соответствующего определения "авто":)
Есть ли встроенный или подключаемый модуль Intellij IDEA? Или в другой среде IDE?
Преобразование, которое вы ищете, довольно сложно:
for each class (interface) that implements ObjectBuilder (not ObjectBuilder<.*>)
if the class declares/defines the method buildObject with return type X
then
modify the class to implement ObjectBuilder<X> instead of ObjectBuilder.
Возможно, вы можете написать плагин для этого, но я подозреваю, что нет выхода из плагина, который имеет язык сценариев, достаточно выразительный, чтобы описать это.
С другой стороны, жестко закодированный script вообще не кажется сложным. У меня нет опыта работы с IntelliJ IDEA, но я вижу, как это можно сделать, даже используя простой поиск/замену в Emnacs Lisp.