IntelliJ IDEA 2018.3 Help

シグネチャーの変更

シグネチャーの変更リファクタリングは、メソッドシグネチャまたはクラスシグネチャに適用できるいくつかの異なる変更を組み合わせています。

クラスの場合、このリファクタリングはクラスをジェネリックに変換し、型パラメータを操作することができます。クラスのすべての呼び出し、実装、オーバーライドを自動的に修正します。

メソッドの場合、このリファクタリングはメソッド名の変更、パラメータや例外の追加、削除、並べ替え、名前の変更、呼び出しの階層を介した新しいパラメータや例外の伝播を行うことができます。

  1. シグネチャーを変更するメソッドまたはクラスを選択します。

  2. コンテキストメニューで、リファクタリング | シグネチャーの変更Ctrl+F6)を選択します。

  3. シグネチャーの変更内容に応じて開くダイアログで、適切なオプションを指定してリファクタリングをクリックします。潜在的な変更のプレビューを表示するには、プレビューをクリックします。

クラスシグネチャーの変更例

型パラメータ Param1, Param2 をクラス MyClassに追加しましょう。

文字列と整数は、それぞれ Param1Param2クラス・シグネチャーの変更ダイアログで指定されたデフォルト値です。

また、パラメータの境界値を追加して、型パラメータに渡すものにいくつかの制限を加えることもできます: 例: Param3 をデフォルト値 List と境界値 Collectionで追加する

change class signature

public class MyClass { public class MyOtherClass { MyClass myClass; void myMethod(MyClass myClass) { } } }

public class MyClass<Param1, Param2, Param3 extends Collection> { public class MyOtherClass { MyClass<String, Integer> myClass; void myMethod(MyClass<String, Integer, List> myClass) { } } }

メソッドのシグネチャー変更の例

メソッドにパラメータを追加し、メソッド・シグネチャーの変更ダイアログでさまざまなオプションを指定して異なる結果を得ることができます。

また、メソッドに例外を追加することもできます。これらの例外は、呼び出し階層で伝播されます。

change method signature

パラメーターの追加

名前 price、タイプ double、およびデフォルト値 0.0を持つパラメーターを追加しましょう。

IntelliJ IDEAは、メソッドにパラメータを追加し、メソッド呼び出しを更新し、デフォルトのパラメータ値を指定します。

public class MyClass { public void myMethod(int value) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1); } } }

public class MyClass { public void myMethod(int i, double price) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1, 0.0); } } }

任意の変数を使用する

すべてのメソッド呼び出しを更新し、メソッド呼び出しの近くで適切な型の変数を探し、それをメソッドに渡しましょう。これを達成するには、任意の変数を使用するオプションをチェックします。

As a result, IntelliJ IDEA finds the variable d which has the same type as the new parameter and uses it in the method call.

public class MyClass { public void myMethod(int value) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1); } } }

public class MyClass { public void myMethod(int i, double price) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1, d); } } }

オーバーロードメソッド

IntelliJ IDEAにメソッド呼び出しを変更せずに保存し、新しいシグネチャでメソッドを呼び出す新しいオーバーロードメソッドを作成してみましょう。これを達成するには、オーバーロード・メソッドによる委譲オプションを使用します。

新しいオーバーロードメソッドには古いシグネチャがあることに注意してください。ただし、新しいシグニチャを使用してメソッドを呼び出します。リファクタリングを実行するときに、 0.0 がデフォルトのパラメータ値として指定されました。

public class MyClass { public void myMethod(int value) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1); } } }

public class MyClass { public void myMethod(int i) { myMethod(i, 0.0); } public void myMethod(int i, double price) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1); } } }

パラメーターの伝播

新しいパラメータを propagateParameters Alt+G をメソッド呼び出し myMethodCall()を介してメソッド呼び出しに伝播しましょう。

その結果、新しいパラメータ price は、呼び出し元のメソッドを介してメソッド呼び出しに伝播し、それに応じてメソッド呼び出しを変更します。

public class MyClass { public void myMethod(int value) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1); } } }

public class MyClass { public void myMethod(int i, double price) { } public class MyOtherClass { public void myMethodCall(MyClass myClass, double price) { double d=0.5; myClass.myMethod(1, price); } } }

例外の伝播

クラス MyClassに例外 IOException をスローするメソッド read を追加しましょう。

次に、 MyClass を拡張し、元の read メソッドをオーバーライドする新しいクラス ExtendsMyClass を作成しましょう。

今度は MyClass に戻って、このリファクタリングによって TimeOutException などの別の例外を追加すると、メソッド read もサブクラスに更新されます。

public class MyClass { public void read() throws IOException{ } public void myMethod(int value) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1); } } } //Let's create a new class "ExtendsMyClass". public class ExtendsMyClass extends MyClass{ @Override public void read() throws IOException{ super.read(); } }

public class MyClass { public void read() throws IOException, TimeOutException{ } public void myMethod(int value) { } public class MyOtherClass { public void myMethodCall(MyClass myClass) { double d=0.5; myClass.myMethod(1); } } } //As you see, "TimeOutException" was added. public class ExtendsMyClass extends MyClass{ @Override public void read() throws IOException, TimeOutException { super.read(); } }

最終更新日: 2019年1月22日