Methode öffnen, F3 und Interfaces

Ausgangssituation:

Ich habe zwei Klassen, von denen die eine (Klasse A1) die andere (Klasse B1) kennt.


    private final B1 b;

    public A1(B1 b) {
        this.b = b;
    }

    public void doSomething() {
        b.doSomething();
    }

    public static void main(String[] args) {
        A1 a = new A1(new B1());
        a.doSomething();
    }

}```

und

```public class B1 {

    public void doSomething() {
        System.out.println("b1");
    }

}```

In diesem Fall ist alles recht einfach. Stehe ich in Eclipse in der Klasse `A1` in Methode `doSoething()` auf dem Aufruf der Methode `b.doSomething()`, so kann ich einfach mit **F3** zu der entsprechenden Methode in der Klasse `B1` springen.

[HR][/HR]


Situation mit Interfaces:

Damit die Klasse `A1` aber nicht ganz abhängig von Klasse `B1` ist, verwende ich gerne Interfaces, die dann nur die Methoden enthalten, die die Klasse `A1` kennen muss.

Jetzt stellt sich die Situation wie folgt dar:

```public class A2 {

    private final BForA b;

    public A2(BForA b) {
        this.b = b;
    }

    public void doSomething() {
        b.doSomething();
    }

    public static void main(String[] args) {
        A2 a = new A2(new B2());
        a.doSomething();
    }

}

    @Override
    public void doSomething() {
        System.out.println("b2");
    }

}

und


    void doSomething();

}```

Stehe ich nun in Eclipse in der Klasse `A2` in Methode `doSoething()` auf dem Aufruf der Methode `b.doSomething()`, so komme ich mit **F3** nur noch zu der entsprechenden Methode im Interface `BForA`. Das ist auch klar, es kann ja beliebig viele Klassen geben, die das Interface implementieren. Trotzdem ist das bei der täglichen Arbeit extrem lästig, nicht direkt zu der "echten" Methode in der Klasse `B2` zu gelangen.

Meine Frage lautet: **Gibt es irgendeinen Weg, zu den Implementierungen einer Methode eines Interfaces zu springen (mit irgendeiner Tastenkombination), oder muss ich wählen zwischen schönerer Trennung und Komfort bei der Entwicklung?**

Wie Du selbst festgestellt hast ist der Sinn von Interfaces die konkrete Implementierung beliebig auszutauschen. Daher ist es der IDE auch nicht möglich zu sagen welche konkrete Implementierung beim Aufruf der im Interface deklarierten Methode tatsächlich ausgeführt wird.
Es möglich den Code im Debugger auszuführen und so in die Implementierung der Methode zu springen. Das wäre unter Eclipse F11 gefolgt von F5 im Debugger.

Man kann sich aber auch in der Type Hierarchy ( F4 ) eine Liste mit allen Klassen die das Interface implementieren anzeigen lassen und darüber auswählen für welche Implementierung der Methode man sich interessiert.

nicht möglich ist übertrieben, sagen wir
„Eclipse verfügt leider nicht über ein einfach umsetzbares, individuell aktivierbares und nachvollziehbar sinnvolles Feature, bei eigendefinierten Interfaces mit nur einer implementierenden Klasse mit F3 direkt dahin zu springen oder ein Fenster zur Auswahl zu öffnen oder sonst wie passendes zum Durchklicken“

[QUOTE=SlaterB]nicht möglich ist übertrieben, sagen wir
„Eclipse verfügt leider nicht über ein einfach umsetzbares, individuell aktivierbares und nachvollziehbar sinnvolles Feature, bei eigendefinierten Interfaces mit nur einer implementierenden Klasse mit F3 direkt dahin zu springen oder ein Fenster zur Auswahl zu öffnen oder sonst wie passendes zum Durchklicken“[/QUOTE]
OK, „nicht möglich“ war vielleicht etwas hart. I.d.R gibt es für ein Interface ja mehr als eine Implementierung woher soll die IDE also wissen welche für den Anwender interessant ist. Eine „indirekte“ Übersichtsliste gibt es ja in der Type Hierachy View. OK ist ein Tastendruck plus zwei Mausklicks. Aber wie oft ist so etwas relevant, so dass es sich lohnen würde da mehr Energie reinzustecken :wink:

wie oft will man mit F3 zu einem Interface springen? da steht ja kaum was drin,
allein dieser Bruch des Arbeitsablaufs ohne Hinweis ist schon ein Problem,
und ein unnötiger Editor ist zu schließen,

Type Hierarchy ist für sich eine schlimme Sache da es extra festen Platz belegt, bei mir üblicherweise den Package Explorer verdeckt, ebenso wieder geschlossen werden muss,
wäre froh wenn es dafür dauerhafte Deinstallierung gäbe :wink: (edit: vielleicht F4 zu deaktiveren, da komme ich manchmal versehentlich drauf…, öfnet sich aber glaube ich auch sonst manchmal)

für Type Hierarchy muss man auch kompliziert auf Maus wechseln, muss man letztlich alsbald sowieo, aber ungewöhnlicher Zeitpunkt schon ein sprübarer Unterschied,
alles sonderbare Unterbrechung gegenüber F3 bei Glück ohne Interface,

besser wäre wie AutoComplete ein kleines sich öffnendes Fenster zur Auswahl, was auch selber wieder verschwindet, Steuerung mit Pfeiltasten

man merkt, ich bin auch selber betroffen :wink:

Wie wäre es denn mit + “all Declarations in workspace”?

bye
TT

schicke Sache

SlaterB hat ganz gut beschrieben, warum das nützlich wäre.

+ „all Declarations in workspace“

kannte ich bisher nicht, ist aber auch wieder nur mit (aufwändigem) Mausbenutzen verbunden, wenn ich eigentlich nur schnell einen Blick darauf werfen will, was dort nochmal genau passiert.

Schade. ich hatte irgendwie gehofft, es gäbe noch einen eleganteren Weg, den ich nur nicht kennen.

besser wäre wie AutoComplete ein kleines sich öffnendes Fenster zur Auswahl, was auch selber wieder verschwindet, Steuerung mit Pfeiltasten

genau

Edit: Zusammen mit einem sprechenden, also möglichst eindeutigen Methodennamen im Workspace (der ist groß…) werde ich wohl erstmal Ctrl+G verwenden. Die Alternative ist: Selbst die implementierende Klasse aussuchen, rechts zur Methode Scrollen, Methode anklicken. Ein einfaches F3 ist da sehr viel eleganter, aber ich weiß nicht, ob man die Macher von Eclipse dazu bringen kann, ein

„[…] ein einfach umsetzbares, individuell aktivierbares und nachvollziehbar sinnvolles Feature, bei eigendefinierten Interfaces mit nur einer implementierenden Klasse mit F3 direkt dahin zu springen oder ein Fenster zur Auswahl zu öffnen oder sonst wie passendes zum Durchklicken“

zu implementieren. Ja, man kann Eclipse sogar erweitern, damit hab ich mich aber nie beschäftigt, und dafür müsste man dann vermutlich auch sehr genau wissen, wie man sich in der internen Datenhaltung zur implementierenden Klasse durchhangeln kann.

Edit 2: Ich lasse es nochmal ein Weilchen „ungelöst“, falls doch jemand noch irgendwelche guten Ideen dazu hat.

[quote=Crian]+ “all Declarations in workspace”
kannte ich bisher nicht, ist aber auch wieder nur mit (aufwändigem) Mausbenutzen verbunden,[/quote]Ääähhhhmm
+ ist eine Tastenkombination.

Und wenn Dir und zu weit auseinander liegen kannst Du das ja auch auf konfigurieren (die Taste wird in meinem Eclipse noch nicht verwendet)

bye
TT

@Crian
wurde schon

CTRL+T genannt? Nutze ich immer und geht fast so schnell wie F3 und es macht eigentlich alles was du willst.

wird ja immer besser,
schade nur um all die Sonderkombinationen,
man muss darauf kommen sie zu benutzen,

wahrscheinlich erst mit F3 zum Interface, dann Ctrl+T hinterhergefeuert,
nur Ctrl+T, selbst falls auf F3-Taste zu konfigurieren, erscheint etwas zu teuer auch mit nur einem Zwischenschritt

Hui!

Strg-T geht auch direkt in A2, um zur Methode nach B2 zu gelangen.

Toll!

*** Edit ***

[QUOTE=Timothy_Truckle;105134]Ääähhhhmm
+ ist eine Tastenkombination.

Und wenn Dir und zu weit auseinander liegen kannst Du das ja auch auf konfigurieren (die Taste wird in meinem Eclipse noch nicht verwendet)

bye
TT[/QUOTE]

Damit meinte ich, dass die Anzeige unten erfolgt und ich dann da erstmal das richtige Projekt ausklappen und die passende Klasse selektieren muss. Dass der Befehl selbst nicht mit der Maus einzugeben ist, war mir durchaus klar. grinst schief

Auch ganz nett für die Anfänger unter euch :stuck_out_tongue:

++ zeigt die aktuelle Belegung

bye
TT