Intellij Ideaのクラスを別のクラスに置き換える方法はありますか?

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

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

10
グローバル置換は、クラスの名前が同じ場合にのみ有効です。だから私はこの特定のケースに答えるかもしれないと思うが、 "質問"に答えないだろう...
追加された 著者 Trejkaz,
インポートステートメントのグローバル置換がそれを行います。
追加された 著者 duffymo,

4 答え

There is this "migrate" function. Right click in whatever class -> Refactor -> Migrate.

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

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

乾杯!

18
追加された
すっきりしたツールですが、IntelliJヘルパーにとっては驚くほど手作業です。
追加された 著者 Patrick M,
私はいつもこれらの "移行"が修正されていると思っていましたが、このようにカスタマイズすることはできませんでした。ここで最高のUXデザインではありません。
追加された 著者 Gregor,

静的メソッドを使用している場合(StringUtilsの例のように)、以前の実装のように新しいクラスに委譲してください

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

then select Refactor->Inline and select "All invocations and remove the method" in the option dialog. In this way you can handle method name changes and argument order changes are well.

3
追加された

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

あなたは方法があると言う

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

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

StringUtils.containsIgnoreCaseを使用しますが、クラス名、メソッド名、および順序引数は異なります。

そのため、メソッドの本体を変更して、代わりに目的のメソッドを呼び出すようにします。

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

Select the method and + + N. This will offer to inline this method everywhere and deletes your method. Your caller now looks like

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

これは元のクラスがクラスの import 、メソッドの import static を使用している場合、またはインポートしていない場合でも機能します。

1
追加された

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

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

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

がんばろう。

0
追加された