2011-10-28 9 views
10

皆さん、私の問題は次のとおりです。プロジェクトの多くの場所で使用されているクラスがあります。そして、私はこのクラスを提供された瓶から別のクラスに置き換える必要があります。これをリファクタリングする方法はありますか?これは簡単な問題だと思いますが、解決方法はわかりません。Intellij Ideaの別のクラスでクラスを置き換える方法はありますか?

ソースコードの置き換えではなく、私が望むのは、すべてのクラスの使用をライブラリから置き換えて、自分のクラスを完全に削除できることです。私自身のStringUtilsを作成し、apache.common StringUtilsライブラリがあることを知り、今では自分のコードのどこにでも使用したいと考えています。そして、クラスメソッドのシグネチャは問題ではありません:それらは一致します。

+3

インポートステートメントでグローバル置換が実行されます。 – duffymo

+1

グローバル置換は、クラスの名前が同じである場合にのみ有効です。だから私はそれがこの特定の事例に答えるかもしれないと思うが、 "質問"に答えないだろう... – Trejkaz

答えて

0

私はIntelliJの専門家ではありませんが、私は一般的にJavaでクラスの読み込みが順番に行われると伝えます。私は、クラスローダーがクラスを順番に探していることを意味しています。つまり、同じクラスがクラスパスに複数回出現すると、最初のバージョンが使用されます。

したがって、どのようにアプリケーションを実行しているかによって異なります。たとえば、java -cp lib.jar;myapp.jar com.mycompany.Mainのようなコマンドラインを使用し、lib.jarとmyapp.jarの両方に同じクラスUtilが含まれている場合、lib.jarバージョンが使用されます。

IDEから実行しているときと同じ効果を得たい場合は、プロジェクトのプロパティをチェックしてみてください。おそらく、プロジェクトのクラスに対して相対的にライブラリジャーの順序を制御できますか?そうでなければ、おそらく、ブートストラップクラスパスにjarを追加することができます。この場合、クラスパスをブートストラップするためにlib.jarを追加してください(あなたのIDEで作業するだけです)。

幸運。

1

最も簡単な方法は、インライン化したいものをマッピングするメソッドを書くことです。

あなたはあなたが、クラス名、メソッド名と順序の引数が異なるしかしStringUtils.containsIgnoreCaseを使用する方法

enum MyStringUtils { 
    public static boolean containsAnyCase(String searchFor, String searchIn) { 
     // something 
    } 
} 

// calling code 
boolean found = MyStringUtils.containsAnyCase(find, in); 

を持っていると言います。

したがって、代わりに目的のメソッドを呼び出すメソッドの本文を変更します。

public static boolean containsAnyCase(String searchFor, String searchIn) { 
     return StringUtils.containsIgnoreCase(searchIn, searchFor); 
    } 

方法を選択し、[> + N. <もしくはCtrl> + < Altキーは、これはどこにでも、このメソッドのインライン化を提供し、あなたの方法を削除します。あなたの呼び出し側は現在、これは元のクラスは、メソッドまたはまったくインポートのimport staticをクラスのimportを使用している場合でも動作します

boolean found = StringUtils.containsIgnoreCase(in, find); 

のように見えます。

3

あなたはRefactor->インラインを選択し、「すべての呼び出しを選択して、メソッドを削除し、その後

public static String myOldMethod(String argument) { 
    return MyNewClass.myNewMethod(argument); 
} 

ようなあなたの以前の実装では、(あなたのStringUtilsのような例が示している)新しいクラスにデリゲートを静的メソッドを使用している場合"オプションダイアログボックスに表示されます。このようにして、メソッド名の変更や引数の順序の変更をうまく処理できます。

18

「移行する」機能があります。どんなクラスでも右クリック - > Refactor - > Migrate。

新しい移行セットを作成する必要があり、最初から実行することはできません。しかし、それはあなたが必要とするものを正確に行います。

を移行するクラスまたはパッケージを選択し、変更するクラスまたはパッケージに通知します。 runを押すと、すべての用途が書き換えられます。その後、古いクラスを削除することは自由です。用途がないからです。

乾杯!

+1

きれいなツールだが、IntelliJヘルパーにとって驚くほど手作業である。 –

+0

私はいつもこれらの "移行"が修正されていると思っていましたが、このようにカスタマイズすることはできませんでした。ここで最高のUXデザインではありません。 – Gregor

関連する問題