2016-04-04 3 views
0

Automated delegation in JavaАвтоматического наследования новообращенных делегации

В приведенной выше ссылке, пользователь задает подобный вопрос, но ответ дал требуется использование отражения.

Мой вопрос заключается в том, является ли инструмент рефакторинга, который автоматически автоматически сгенерирует весь однострочный метод для каждого из классов делегирования.

Intellij предлагает инструмент «Заменить наследование с делегированием», но он не выполняет работу должным образом - когда я использую его, создается большой беспорядок дублирующих методов и другое странное поведение, что делает его хуже, чем его выполнение вручную (Я думаю, это потому, что несколько интерфейсов он пытается делегировать, которые сталкиваясь друг с другом и в результате чего весь беспорядок.

могу ли я делать это неправильно или, возможно, это ошибка или ограничение в IntelliJ?

Любое решение, которое я могу вместо того, чтобы тратить время на копирование кода?

EDIT:

Я изолировал проблему как последуйте (каждый класс в отдельном файле, конечно):

class TestClass extends MyClass { 
    void function() {} 
} 
class MyClass extends MyAbstractClass implements MyInterface { 
    @Override 
    void function() {} 
} 
abstract class MyAbstractClass { 
    abstract void function(); 
} 
interface MyInterface { 
    void function(); 
} 

Теперь, если я использую «Заменить Наследование с делегацией» на TestClass я получаю следующий результат:

class TestClass implements MyInterface { 
    private final MyMyClass myClass = new MyMyClass(); 

    void function() { 
     myClass.function(); 
    } 

    void function() { 
     myClass.function(); 
    } 

    private class MyMyClass extends MyClass { 
     void function() {} 
    } 
} 

Так функция() появляется дважды, что я считаю, не следует, так как, естественно, код не может скомпилировать с двумя функции с одинаковой подписью, заставляя меня вручную удалить один из них, который является утомительным с реальными классами со многими функции с одной и той же сигнатурой

Попробуйте его, например, с помощью MyClass<E> extends HashSet<E> и посмотрите, что это за беспорядок. Я мог бы выбрать конкретные функции для делегирования и убедиться, что я не выбираю только один метод с идентичными сигнатурами, но это делает весь этот рефакторинг бессмысленным - мне было бы быстрее просто написать функции переадресации ...

+0

Это не _seem_, как это должно быть намного труднее написать, чем другие IDE-объекты, которые реализуются, как intellitype. «Ошибка в IntelliJ» - это мой коленный рывок. – Vyross

+0

Невозможно сказать, является ли это ошибкой в ​​IntelliJ, не видя кода, на котором вы ссылаетесь на рефакторинг. – yole

+0

@yole Я добавил упрощенный пример кода – traveh

ответ

1

Создайте дочерний класс, переопределив все методы, а затем замените super. на delegate.. Некоторые IDE даже имеют эту опцию.

+0

Удивительно, что это отличный способ обхода, я буду использовать его. хотя первоначальная проблема, которую я описал, является ошибкой в ​​рефакторинге IntelliJ, правильно? – traveh

Смежные вопросы