2017-06-18 1 views
0

In unserer Codebasis, suche ich nach anonymen Unterklassen einer bestimmten Klasse, die eine bestimmte Methode implementieren und keine anderen Methoden oder Felder haben. Diese können in einen Lambda-Ausdruck konvertiert werden und die Notwendigkeit für diese anonyme Unterklasse beseitigen.IDEA strukturelle Suche nach Klassen implementieren eine bestimmte Methode und keine andere

Die Suchmaske ich mit wie folgt aussieht kam:

ist
new SimpleListSubstitution<$Type$>() { 
    @Modifier Iterable<$Type$> getItems() { 
     return $EXPRESSION$; 
    } 
} 

Der Ersatz Vorlage folgt aus:

SimpleListSubstitution.forItems(() -> $EXPRESSION$) 

Nun dieser Ausdruck alle Instanzen finde ich Refactoring wollen, aber es zusätzlich findet Unterklassen, die auch andere Methoden implementieren (Hilfsmethoden oder überschrieben von der Oberklasse).

Als Beispiel möchte ich es die Unterklasse in diesem Code zu finden:

template.put("pathToRoot", SimpleListSubstitution.forItems(() -> listOfPagesToRoot)); 

Aber ich es das finden, um nicht möchten:

template.put("pathToRoot", new SimpleListSubstitution<Page>() { 
    @Override 
    protected Iterable<Page> getItems() { 
     return listOfPagesToRoot; 
    } 
}); 

Dies wird in den folgenden umgewandelt werden Unterklasse in diesem Code auf Grund der zusätzlichen putAdditionalSubstitutions Methode:

template.put("children", new SimpleListSubstitution<Page>() { 
    @Override 
    protected Iterable<Page> getItems() { 
     return getChildren(page, booleanFeatureName); 
    } 

    @Override 
    protected void putAdditionalSubstitutions(Template template) { 
     template.put("link", /*...*/); 
    } 
}); 

gibt es eine Möglichkeit e xpress "keine anderen Methoden" im Suchen/Ersetzen-Dialog?

Momentan sehe ich nur den Ansatz, jeden Treffer in der Ansicht Suchen zu überprüfen und die unerwünschten Treffer zu entfernen und den Rest zu ersetzen. Da wir diese und ähnliche Refactorings einige Male anwenden müssen (z. B. um gleichzeitig geschriebenen neuen Code zu behandeln), wird dies ziemlich mühsam.

Antwort

1

Sie können eine Suchvorlage wie folgt verwenden:

new SimpleListSubstitution<$Type$>() { 
    @Override 
    protected Iterable<$Type$> getItems() { 
     return $EXPRESSION$; 
    } 
    $ReturnType$ $Method$($ParameterType$ $Parameter$); 
} 

Mit den folgenden variablen Einstellungen:
Method min: 0, max: 0
Parameter min: 0, max: unbegrenzt

Beachten Sie, dass dieses Muster versucht, zusätzliche Methoden zu finden, aber da Method auf 0 Vorkommen gesetzt ist, schlägt die Übereinstimmung fehl, wenn eine Methode gefunden wird. Auf diese Weise landen nur die Klassen, die keine zusätzlichen Methoden definieren, in den Suchergebnissen.

+0

Ja! Das funktioniert. Man muss darauf achten, dass alle Variableneinstellungen gesetzt werden (zuerst wurde die Anzahl der Parameter verpasst, wodurch nur einige der Übereinstimmungen unterdrückt wurden). Vielen Dank! –

Verwandte Themen