2016-04-04 17 views
0

Automated delegation in JavaAutomatische convert Erbe Delegation

In dem obigen Link, fragt der Benutzer eine ähnliche Frage, aber die gegebene Antwort erforderlich Reflexion verwendet wird.

Meine Frage ist, ob ein Refactoring-Tool ist, das automatisch alle Einliner-Methode für jede der delegierenden Klasse automatisch generiert.

Intellij bietet eine „Ersetzen Vererbung mit Delegation“ Werkzeug, aber es macht den Job nicht richtig - wenn ich es verwenden, um ein großes Durcheinander von doppelten Methoden und andere seltsame Verhalten schafft, die es noch schlimmer macht, als es tatsächlich manuell tun (ich denke, es ist, weil mehrere Schnittstellen es zu delegieren versucht, die miteinander aufeinanderprallen und verursachen eine ganze verwirrung.

Bin ich es falsch zu machen oder vielleicht ist es ein Bug oder Einschränkung in IntelliJ?

jede Abhilfe, die ich kann, Verwenden Sie statt meine Zeit zu verbringen Kopieren-Einfügen-Code?

EDIT:

ich das Problem wie folgt isoliert haben (jede Klasse ist in einer separaten Datei natürlich):

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(); 
} 

Nun, wenn ich „Vererbung Mit Delegation ersetzen“ verwenden, um auf Testclass ich folgendes Ergebnis:

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() {} 
    } 
} 

So function() erscheint zweimal, was ich glaube, sollte nicht da natürlich der Code kann mit zwei Funktion mit identischer Signatur nicht kompiliert, zwang mich manuell eine von ihnen zu entfernen, die mit vielen mit dem tatsächlichen Klassen langweilig ist funktioniert mit der gleichen Signatur

Versuchen Sie es zum Beispiel mit MyClass<E> extends HashSet<E> und sehen, was für ein Durcheinander es wird. Ich konnte die spezifischen Funktionen wählen zu delegieren und stellen Sie sicher, dass ich nicht wählen Sie nur 1 Methode mit identischen Signaturen, aber das macht die ganze sinnlos Refactoring - es schneller sein, wäre für mich nur die Weiterleitungsfunktionen selbst schreiben ...

+0

, der wie es nicht zu schreiben, dass es sehr viel schwieriger _seem_ sollte als die anderen Sachen IDEs implementieren, wie IntelliType. "Bug in IntelliJ" ist mein Instinkt. – Vyross

+0

Es ist unmöglich zu sagen, ob es sich um einen Fehler in IntelliJ handelt, ohne den Code zu sehen, auf den Sie das Refactoring anwenden. – yole

+0

@yole Ich habe einen vereinfachten Codebeispiel hinzugefügt – traveh

Antwort

1

Generieren Sie eine untergeordnete Klasse, die alle Methoden überschreibt, und ersetzen Sie dann super. durch delegate.. Einige IDEs haben sogar diese Option.

+0

Awesome, dass ein großes Problem umgehen, indem ich sich verwenden. Obwohl das ursprüngliche Problem, das ich beschrieben habe, ein Fehler beim IntelliJ Refactoring ist, richtig? – traveh