是否可以在Intellij中自动完成构建器?

时间:2018-12-02 12:20:59

标签: java intellij-idea autocomplete builder

例如,我有一个带有5个参数的生成器的类,而不是我手动选择并填充参数,而是有一种方法可以告诉Intellij做到这一点:

MyClass myClass = MyClass.builder()
                   .param1()
                   .param2()
                   .param3()
                   .param4()
                   .param5()
                   .build();

然后我可以自己填写参数。确保我没有错过任何机会很方便。
另外,我可以设置自动完成选项以使其在课程中出现的顺序排序吗?

2 个答案:

答案 0 :(得分:1)

即使有这样的插件,我相信它也不会真正帮助您(因为您仍然需要手动单击每个方法调用并提供参数),并且绝对不应该使用IDE来保护您避免未设置所有必需参数

在这种情况下,您可以将所有强制性参数放入构造函数中,也可以在build方法内提供验证。像

public MyClass build() {
    if(param1 == null) {
        // handle param1 null value
    }
    if(param2 == null) {
       // etc
    }
    ...
}

答案 1 :(得分:0)

为确保没有遗漏任何参数,可以对构建器模式使用特定的变体。我称之为“命名参数”:

public final class MyClassBuilder {
    public static Param2 param1(String param1) {
        return param2 -> param3 -> param4 -> param5 -> new MyClass(
            param1, param2, param3, param4, param5
        );
    }
    public interface Param2 {
        Param3 param2(String value);
    }
    public interface Param3 {
        Param4 param3(int value);
    }
    public interface Param4 {
        Param5 param4(boolean value);
    }
    public interface Param5 {
        MyClass param5(Object value);
    }
}

用法如下:

MyClass m = MyClassBuilder.param1("1")
                          .param2("2")
                          .param3(3)
                          .param4(false)
                          .param5(new Object());

使用这种模式,编译器(和任何IDE)将强制执行参数的顺序,并调用所有参数,因为任何中间状态都不允许获得结果。它也不需要任何额外的build()方法,因为最后一个参数已经可以返回结果了。

还有更多的编码,但是我计划在我的项目中为它创建一个代码生成器:https://github.com/c0stra/fluent-api-generator