パラメーターの導入
パラメーターの導入 リファクタリングでは、新しいパラメーターをメソッドに抽出できます。
関数型パラメーターの導入 リファクタリングを使用することもできます。 この場合、IntelliJ IDEA は選択されたコードを解析し、抽出されたフラグメントのメソッドシグネチャーを見つけ、このメソッドシグネチャーを持つすべての機能インターフェースを見つけ、選択されたインターフェースに基づく匿名クラスでコードフラグメントをラップし、この匿名クラスをパラメーターとして使用します。
エディターで、パラメーターとして導入する式内にキャレットを置き、 Ctrl+Alt+P を押すか、メインメニューの に移動します。
あるいは、コードフラグメントを選択します。 表示される ツールバーで、「抽出 」をクリックし、「パラメーター 」を選択します。
関数型パラメーターを抽出したい場合は、 Ctrl+Alt+Shift+P を押すか、メインメニューの に移動します。
パラメーターの名前を指定し、 パラメーターの導入 ポップアップで必要なオプションを選択します。 このリファクタリングを呼び出すと、IntelliJ IDEA は追加のオプションを設定できる
も表示します。

例: 既存のメソッド呼び出しを変更したくない場合は、 オーバーロードメソッドによる委譲 チェックボックスを選択します。
必要なら、 Shift+Tab を押して新しいパラメーターの型を変更します。 (このステップでパラメーター名の編集に戻りたい場合は、 Tab を押します。)
後
新しいパラメーターを抽出するときは、既存のメソッドにパラメーターを導入するか、 オーバーロードメソッドによる委譲 オプションを使用して元のメソッドを保存し、パラメーターで新しいメソッドを定義します。
メソッド generateText () の文字列値 "Hello, World!" を新しいパラメーター テキスト に置き換えましょう。 値 "Hello, World!" は、更新されたメソッド呼び出し generateText("Hello, World!") のメソッドに渡されます。
前 | 後 |
|---|---|
public class HelloWorldPrinter {
public static void print() {
System.out.println(generateText());
}
private static String generateText() {
return "Hello, World!".toUpperCase();
}
}
|
public class HelloWorldPrinter {
public static void print() {
System.out.println(generateText("Hello, World!"));
}
private static String generateText(String text) {
return text.toUpperCase();
}
}
|
前 | 後 |
|---|---|
object HelloWorldPrinter {
fun print() {
println(generateText())
}
private fun generateText(): String {
return "Hello, World!".toUpperCase()
}
}
|
object HelloWorldPrinter {
fun print() {
println(generateText("Hello, World!"))
}
private fun generateText(text: String): String {
return text.toUpperCase()
}
}
|
今度は オーバーロードメソッドによる委譲 を使いましょう。 この場合、新しいオーバーロードメソッドが作成され、このメソッドの定義で新しいパラメーターが抽出されます(2 番目の generateText() メソッド)。 既存の generateText() メソッドのシグネチャーは変更されません。 ただし、メソッド自体は変更されています。 今度は、新しい generateText() メソッドを呼び出し、この呼び出しで値 "Hello, World!" を渡します。 generateText() の既存の呼び出し(メソッド print() )は変更されません。
前 | 後 |
|---|---|
public class HelloWorldPrinter {
public static void print() {
System.out.println(generateText());
}
private static String generateText() {
return "Hello, World!".toUpperCase();
}
}
|
public class HelloWorldPrinter {
public static void print() {
System.out.println(generateText());
}
private static String generateText() {
return generateText("Hello, World!");
}
private static String generateText(String text) {
return text.toUpperCase();
}
}
|
前 | 後 |
|---|---|
object HelloWorldPrinter {
fun print() {
println(generateText())
}
private fun generateText(): String {
return "Hello, World!".toUpperCase()
}
}
|
// if you selected the "Introduce default value" option
object HelloWorldPrinter {
fun print() {
println(generateText())
}
private fun generateText(text: String = "Hello, World!"): String {
return text.toUpperCase()
}
}
|
フィールドをメソッド宣言の新しいパラメーターとして提供する場合、メソッド呼び出しでそのフィールドはクラスインスタンスのフィールドとして提示されます。
Hello.printHello() 内の System.out.println(s); でリファクタリングを実行しましょう。
IntelliJ IDEA は、適切なメソッドシグネチャー (String) -> void を持つすべての機能インターフェースを検索し、そのうちの 1 つを選択することを提案します。 (この例では、インターフェース Person が選択されています。)
その結果、選択されたフラグメント System.out.println(s); は、インターフェース Person に基づく匿名クラスでラップされます。 この匿名クラスは、 printText() 内の printHello() の呼び出しにパラメーターとして渡されます。
Person はパラメーターとして printHello() に追加され、最初に選択されたコードフラグメントは、インターフェース sayHello() のメソッドの呼び出しに置き換えられます。
前 | 後 |
|---|---|
@FunctionalInterface
public interface Person {
public void sayHello (String s);
}
public class Hello {
private void printHello () {
String s="Hello";
System.out.println(s);
}
private void printText () {
printHello();
}
}
|
@FunctionalInterface
public interface Person {
public void sayHello (String s);
}
public class Hello {
private void printHello(Person person) {
String s = "Hello";
person.sayHello(s);
}
private void printText () {
printHello(new Person() {
public void sayHello(String s) {
System.out.println(s);
}
});
}
}
|
パラメーターの導入リファクタリングに関する特別な注意
メソッド宣言でフィールドを新しいパラメーターとして提供する場合、メソッド呼び出しでこのフィールドはクラスインスタンスのフィールドとして表示されます。
クラスメンバーがアクセスできない場合(たとえば、上記の例ではフィールドは private です)、メソッド呼び出しに挿入されますが、このファイルをコンパイル不能にするエラーとしてハイライトされます。
getter のパラメーターを導入を使用してフィールドをリファクタリングする場合は、拡張ダイアログが表示されます。 このダイアログには、オプショングループ 式で使用されるフィールドを getter に置換 があります。
置換しない: どのフィールドも getter の呼び出しに置き換えられません。
コンテキストのアクセスできないフィールドを置換する: 使用状況のコンテキストから直接アクセスできないフィールドのみが getter の呼び出しに置き換えられます。
すべてのフィールドを置換する: すべてのフィールドは getter への呼び出しに置き換えられます。
ローカル変数にリファクタリングを適用すると、追加のチェックボックスを含む パラメーターの導入 ダイアログが呼び出されます。
出現箇所をすべて置換 (<number_of_occurrences> 回の出現): 有効にすると、選択した変数のすべての出現箇所がパラメーターに置き換えられ、 変数定義を削除する チェックボックスが有効になります。 それ以外の場合は、選択された変数の使用箇所のみがパラメーターに置き換えられます。
変数定義を削除する: 有効にすると、変数定義は削除されます。
パラメーターの初期化に変数イニシャライザーを使用する: 有効にすると、変数イニシャライザーを使用してメソッド呼び出しのパラメーターを初期化します。
副次作用
パラメーターの導入 リファクタリングを使用すると、実際のメソッドパラメーターであるクラスインスタンスまたは式に適用すると、予期しない副作用が発生する可能性があります。 たとえば、そのようなコードの場合:
フィールド フィールド に適用されたリファクタリング後のコード:
反復子の値は 2 倍に増えます。これは実際に期待する動作ではありません。
ただし、IntelliJ IDEA は一時変数を正常に使用し、増分 / 減分 / 代入操作や新しいキーワードの使用などのケースを解決できます。 例:
リファクタリング後の同じコードは次のようになります。
新しい変数 リスト が作成され、この変数を使用してメソッド呼び出しに使用されるすべてのパラメーターが提供されます。
Extract Parameter リファクタリングでゲッターを持つフィールドを使用する場合、拡張ダイアログが表示されます。
このダイアログを使用して、パラメーターを抽出するための設定を指定します。
項目 | 説明 |
|---|---|
型のパラメーター | 新しいパラメーターの型を指定します。 通常、IntelliJ IDEA が提案する型を変更する必要はありません。 |
名前 | 新しいパラメーターの名前を指定します。 |
出現箇所をすべて置換 | このオプションを選択すると、メソッド内で選択された式のすべての出現箇所が置換されます。 |
final で宣言 | パラメーター |
オーバーロードメソッドによる委譲 | 既存のメソッド呼び出しを変更しないようにするには、このオプションを選択します。 その結果、新しいオーバーロードメソッドが作成され、新しいパラメーターがこのメソッドの定義に追加されます。 古い署名のメソッドは保持されます。 新しいメソッドへの呼び出しは、古いメソッドに追加されます。 この呼び出しでは、必要な値(または式)が新しいメソッドに渡されます。 |
次のオプションは、式に getter を持つクラスフィールドへの直接呼び出しが含まれている場合に使用できます。 | |
置換しない | スコープコンテキストに関係なくフィールドへの直接呼び出しを使用するには、このオプションを選択します。 |
コンテキストのアクセスできないフィールドを置換する | フィールドが直接アクセスできない場合にのみ getter への呼び出しを使用するには、このオプションを選択します。 |
すべてのフィールドを置換する | getter への呼び出しを使用するには、このオプションを選択します。 |
リファクタリングされた式にローカル変数が含まれている場合は、次のオプションを使用できます。 | |
変数定義を削除する | ローカル変数の定義を削除するには、このオプションを選択します。 |
パラメーターの初期化に変数イニシャライザーを使用する | 修正されたメソッド呼び出しで、選択した変数のデフォルト値を使用するには、このオプションを選択します。 |
パラメーター抽出ダイアログ(Groovy)
このダイアログを使用して、Groovy のパラメーター抽出リファクタリングに関連するオプションと設定を指定します。
項目 | 説明 |
|---|---|
タイプ | 新しいパラメーターの型を指定します。 通常、IntelliJ IDEA が提案する型を変更する必要はありません。 |
名前 | 新しいパラメーターの名前を指定します。 |
final で宣言 | パラメーター |
オーバーロードメソッドによる委譲 | 既存のメソッド呼び出しを変更しないようにするには、このオプションを選択します。 その結果、新しいオーバーロードメソッドが作成され、新しいパラメーターがこのメソッドの定義に追加されます。 古い署名のメソッドは保持されます。 新しいメソッドへの呼び出しは、古いメソッドに追加されます。 この呼び出しでは、必要な値(または式)が新しいメソッドに渡されます。 |
使用されなくなったパラメーター <name> を削除 | パラメーターを削除するには、このチェックボックスを選択します。 |
明示的な return ステートメントを使用する | このチェックボックスは、メソッドが値を返す場合にアクティブになります。 |
パラメーター | この領域で、新しいメソッド / 関数に渡すパラメーターを選択します。 |
上 / 下に移動 | これらのボタンを使用して、パラメーターの順序を変更します。 |
シグネチャープレビュー | この読み取り専用フィールドに、新しいメソッド / 関数の宣言を表示します。 |