Aqua 2024.3 Help

Extract/Introduce variable

If you come across an expression that is hard to understand, or it is duplicated in several places throughout your code, the Extract Variable refactoring Ctrl+Alt+V can help you deal with those problems placing the result of such expression or its part into a separate variable that is less complex and easier to understand. Plus, it reduces the code duplication.

Starting with Java 1.8 and later versions, Aqua also lets you extract a functional type variable.

If your Java version supports the pattern matching (Java 14 preview or higher), and you are extracting a cast expression under the instanceof check, Aqua may introduce a pattern variable at that instanceof check instead of a normal local variable. Also, you can inline pattern variable since the Java 14 version. In this case, all the occurrences will be replaced with old-style cast expression.

You can use the Introduce Variable refactoring to extract variadic arguments into a new slice variable.

  1. In the editor, select an expression or its part that you want to extract. You can also place the caret within the expression, in this case Aqua offers you a list of potential code selections.

  2. Press Ctrl+Alt+V or go to Refactor | Extract/Introduce | Variable in the main menu.

    Aqua also displays the Gear icon next to a variable that you can use to configure more options.

    If Aqua finds more than one occurrence, it lets you specify a scope and extract just a part of the found occurrences and not just all of them.

    Introduce variable occurrences scope
  3. Select a name suggested in the popup or type your own and press Enter.

    Extracting a variable

    You can also declare the variable you are extracting as final.

    If you want to reassign the existing variable to a new one, press Ctrl+Alt+V. If you have more than one existing variable, Aqua displays a list to choose from.

    You can press Shift+Tab to change a type of the variable.

    Declaring a variable final

By default, this extract refactoring will be applied in the editor. To change your settings to apply the refactoring via a modal, open the Settings dialog (Ctrl+Alt+S) , go to Editor | Code Editing, and in the Refactorings area select In modal dialogs.

Example

Let's extract the anotherClass.inValue() variable that occurs twice throughout the code and give it a name number.

Before

After

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; }

Before

After

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 }

Extract functional variable

This refactoring creates a functional expression for Java 1.8 and later versions, and an anonymous class for older versions of Java.

  1. Select the code fragment, in this example, an argument of the println method.

    argument_println.png
  2. In the main menu, go to Refactor | Extract/Introduce | Functional Variable.

    Aqua opens the Extract Functional Variable dialog.

    Alternatively, from the context menu in the editor, select Refactor | Refactor This Ctrl+Alt+Shift+T, and select Functional Variable.

    extrct_funtional_var.png
  3. When the selected code depends on instance fields, like in the example, the Pass field as params checkbox will appear, and you can pass a parameter in a place of fields.

    extrct_funtional_var_parameter.png

    However, if for example, your selected code fragment depends on any local variable or a parameter

    sample_string.png

    the corresponding entries would appear in the list.

    local_variable_and_parameter.png

    When you deselect one of the parameters in the dialog, the corresponding local values will be used instead.

    when_param_deselected.png

    Configure your options and click OK.

  4. Choose an applicable functional interface from the popup.

    functional_interface.png
  5. If you want, change a name of the extracted variable if you don't want to use the name suggested in the list.

    changing_variable_name.png
  6. Aqua creates lambda that you can use further.

    composed_function.png

Example

Before

After

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)); } }
Last modified: 23 October 2024