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

Posted

技术标签:

【中文标题】是否可以在 Intellij 中自动完成构建器?【英文标题】:Is it possible to auto complete a builder in Intellij? 【发布时间】:2019-05-03 22:41:40 【问题描述】:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于是否可以在 Intellij 中自动完成构建器?的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA 自动显示 javadoc

Intellij IDEA - 查看已保存的密码

有啥方法可以在 Eclipse 中获得类似 IntelliJ 的自动完成功能?

在IntelliJ Idea中是否有任何键盘快捷方式可以在课堂上添加@SuppressWarnings?

如何在构建步骤中配置自动提交

IntelliJ 可以自动创建装饰器类吗?