IntelliJ IDEA 2020.3 ヘルプ

変数の抽出 / 導入

変数の抽出リファクタリングは、理解しにくい表現を見つけたり、コード全体のいくつかの箇所で重複したりすると、そのような表現やその部分の結果を複雑ではない別の変数に配置する際に役立ちます。理解しやすいさらに、コードの重複を減らすことができます。

Java 1.8 以降のバージョンから、IntelliJ IDEA では機能型変数も抽出できます。

Java バージョンがパターンマッチング(英語)(Java 14 プレビュー以降)をサポートしていて、instanceof チェックでキャスト式を抽出している場合、IntelliJ IDEA は、通常のローカル変数ではなく、その instanceof チェックでパターン変数を導入する場合があります。また、Java 14 バージョン以降、パターン変数をインライン化できます。この場合、すべての出現箇所は古いスタイルのキャスト式に置き換えられます。

変数の導入リファクタリングを使用して、可変個引数を新しいスライス変数に抽出できます。

  1. エディターで、抽出する式またはその部分を選択します。キャレットを式の中に置くこともできます。この場合、IntelliJ IDEA は潜在的なコード選択のリストを提供します。

  2. Ctrl+Alt+V を押すか、メインメニューからリファクタリング | 抽出 / 導入 | 変数を選択します。

  3. ポップアップで提案された名前を選択するか、独自の名前を入力して Enter を押します。
    Extract var

    IntelliJ IDEA で複数の出現箇所が見つかった場合は、スコープを指定して、見つかった出現箇所のすべてではなく一部だけを抽出できます。

    Introduce variable occurrences scope

    また、final として抽出する変数を宣言することもできます。

    既存の変数を新しい変数に再割り当てする場合は、Ctrl+Alt+V を押します。既存の変数が複数ある場合、IntelliJ IDEA は選択するリストを表示します。

    Shift+Tab を押すと、変数の型を変更できます。

    Change type for var

設定 / 環境設定ダイアログ Ctrl+Alt+Sコード編集ページのリファクタリング領域でモーダルダイアログ内リファクタリングオプションが選択されている場合、IntelliJ IDEA はこのリファクタリングのための変数の抽出ダイアログを開きます。

Extract var dialog

コード全体で 2 回発生する anotherClass.inValue() 変数を抽出し、number という名前を付けてみましょう。

public void method() { int a = 1; ... int b = a + anotherClass.intValue(); int c = b + anotherClass.intValue(); }
public void method() { int a = 1; ... int number = anotherClass.intValue(); int b = a + number; int c = b + number; }
func method() { val a = 1 val b = a + anotherClass!!.intValue() val c = b + anotherClass!!.intValue() }
func method() { val a = 1 val number = anotherClass!!.intValue() val b = a + number val c = b + number }

関数型変数を抽出する

このリファクタリングにより、Java 1.8 以降のバージョンの関数式と古いバージョンの Java の匿名クラスが作成されます。

  1. この例では、コードフラグメントを println メソッドの引数として選択します。

    Argument println

  2. メインメニューで、リファクタリング | 抽出 / 導入 | 関数型変数を選択します。
    IntelliJ IDEA は関数型変数の抽出ダイアログを開きます。

    または、エディターのコンテキストメニューからリファクタリング | リファクタリング Ctrl+Alt+Shift+T を選択し、関数型変数を選択します。

    Extrct funtional var
  3. 選択したコードがこの例のようにインスタンスフィールドに依存する場合は、フィールドをパラメーターとして渡すチェックボックスが表示され、フィールドの場所にパラメーターを渡すことができます。

    Extrct funtional var parameter
    ただし、たとえば、選択したコードフラグメントがローカル変数またはパラメーターに依存する場合
    Sample string
    対応するエントリがリストに表示されます。
    Local variable and parameter
    ダイアログ内のいずれかのパラメーターの選択を解除すると、対応するローカル値が代わりに使用されます。
    When param deselected
    オプションを設定し、OK をクリックします。

  4. ポップアップから適切な機能インターフェースを選択します。

    Functional interface

  5. 必要に応じて、リストで提案された名前を使用しない場合は、抽出された変数の名前を変更します。

    Changing variable name

  6. IntelliJ IDEA はさらに使用できるラムダを作成します。

    Composed function

import java.util.List; public class PrintAction implements Runnable { private List<String> data; public PrintAction(List<String> data) { this.data = data; } public void run() { System.out.println("Data: " + data.toString()); } }
import java.util.List; import java.util.function.Function; public class PrintAction implements Runnable { private List<String> data; public PrintAction(List<String> data) { this.data = data; } public void run() { Function<List<String>, String> presenter = (p) -> "Data: " + p.toString(); System.out.println(presenter.apply(data)); } }