javaintellij-ideasettermutators

Can IntelliJ generate chainable setters/mutators for Java classes?


Is it possible to generate chainable field mutators in IntelliJ IDEA? Preferably with a prefix other than set to avoid breaking conventions. Let's say withX is the chainable companion to setX.

For example, given this class stub

class SomeClass {
    private String foo;
}

I can use Generate -> Setters to generate a public void setFoo(String foo) method.

class SomeClass {
    private String foo;

    public void setFoo(String foo) {
        this.foo = foo;
    }
}

Is there a similar way to generate a public SomeClass withFoo(String foo) method like so?

class SomeClass {
    private String foo;

    public SomeClass withFoo(String foo) {
        this.foo = foo;
        return this;
    }
}

Solution

  • You don't actually need to install any third-party plugin. IDEA provides this functionality out-of-the-box. Here are the steps to achieve this:

    1. Select Code|Generate (or press Alt+Insert) then select "Setter".
    2. In the opened window click on the button with three dots at the upper-right corner.
    3. Click on the green plus sign at the upper-left corner in order to create new setter template. Name it as you want.
    4. Put the following code snippet into the right input panel (actually this is the default "Builder" template with replaced "set" prefix with "with"):
    #set($paramName = $helper.getParamName($field, $project))
    public ##
    #if($field.modifierStatic)
    static void ##
    #else
        $classSignature ##
    #end
    with$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) {
    #if ($field.name == $paramName)
        #if (!$field.modifierStatic)
        this.##
        #else
            $classname.##
        #end
    #end
    $field.name = $paramName;
    #if(!$field.modifierStatic)
    return this;
    #end
    }
    
    1. Click "OK" and insert generated setter into you class.

    You should do it only once. In the future you'll only have to select your setter template to generate it.