【问题标题】:Is it possible to auto complete a builder in Intellij?是否可以在 Intellij 中自动完成构建器?
【发布时间】:2025-12-21 23:30:15
【问题描述】:

例如,我有一个带有 5 个参数的构建器的类,而不是我手动选择参数并填充它们,有没有办法告诉 Intellij 这样做:

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

那我自己填参数就好了。确保我没有错过任何东西会很方便。
或者,我可以将自动完成选项设置为按照它们在课堂上出现的顺序进行排序吗?

【问题讨论】:

  • 你不应该这样做 - 最好在你的 build 方法中提供验证
  • 好的,这是有道理的,当然,在构建方法本身中验证所需的参数。关心写一个答案? (即便如此,这将是一个很好的功能,可以节省时间)
  • 老实说,我不相信这会节省您的时间 - 您仍然需要为此类调用手动提供参数,而 IntelliJ 自动完成功能似乎“足够好”:)

标签: java intellij-idea autocomplete builder


【解决方案1】:

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

在这种情况下,您要么将所有必需参数放入构造函数,要么在 build 方法中提供验证。类似的东西

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

【讨论】:

    【解决方案2】:

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

    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

    【讨论】: