2017-06-18 2 views
0

コードベースでは、特定のメソッドを実装し、他のメソッドやフィールドを持たないクラスの匿名サブクラスを探しています。これらをラムダ式に変換して、その無名サブクラスの必要性を取り除くことができます。IDEA特定のメソッドを実装しているクラスの構造検索で、他のメソッドはありません

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

今、この表現は私がリファクタリングしたいすべてのインスタンスを見つけたが、さらにそれ:交換用のテンプレートはこれです

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

検索テンプレート私はこのようなルックスを思い付い他のメソッド(ヘルパーメソッドまたはスーパークラスからオーバーライドされたもの)も実装するサブクラスを検索します。

例として、私はそれがこのコードでは、サブクラスを見つけたい:

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

これは以下に変換されます。

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

しかし、私はそれを見つけることができませんしたいですこのコードでは、サブクラスによる追加putAdditionalSubstitutions方法に:

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

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

は、Eする方法はあります検索/置換ダイアログの「他の方法はありません」をxpressしますか?

現在、私はFindビューで各ヒットをチェックし、不要なヒットを取り除いて残りを置き換えるアプローチしか見ません。これと同様のリファクタリングを数回(例えば、同時に書かれた新しいコードを処理するために)適用する必要があるので、これはかなり手間がかかります。

あなたは、このような検索テンプレートを使用することができます

答えて

1

:次の変数設定で

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


Method最小:0、最大:0
Parameter最小:0、最大:無制限

をこのパターンは追加のメソッドを照合しようとしますが、Method0オカレンスに設定されているため、メソッドが見つかると一致は失敗します。この方法では、追加のメソッドを定義しないクラスだけが検索結果になります。

+0

はい!これは機能します。実際には、すべての変数設定(パラメータの数が不足しているため、一致の一部しか表示されませんでした)を実際に設定する必要があります。ありがとうございました! –

関連する問題