在 IntelliJ 中自定义 `Code` > `Generate` > `Constructor`

Posted

技术标签:

【中文标题】在 IntelliJ 中自定义 `Code` > `Generate` > `Constructor`【英文标题】:Customize `Code` > `Generate` > `Constructor` in IntelliJ 【发布时间】:2018-01-30 00:07:42 【问题描述】:

选择Code > Generate > Constructor时,我想自定义IntelliJ 2017.2生成的参数的命名为:

标记他们final。 将Arg附加到每个变量名称的末尾。例如,firstNameArg & lastNameArg 而不是firstName & lastName。 用@NotNull注释每个参数。

有没有办法自定义生成构造函数代码?

这个问题Customizing of code generation in IntelliJ IDEA 类似,但 (a) 不涉及构造函数,并且 (b) 可能已过时。

【问题讨论】:

您为什么要这样做?默认参数名称就可以了。很容易手动更改。就我个人而言,我讨厌那种匈牙利命名法。如果您有太多参数以至于手动重命名是一种负担,我会说您的构造函数设计不佳。 我认为现在不可能。顺便提一句。为什么需要这种功能? “为什么”是为了避免歧义、避免冲突和可读性。另外,我进行了编辑以注意我还希望标记参数final 【参考方案1】:

我认为 IntelliJ 不提供此 OOTB。您或许可以通过Preferences > Editor > Live Templates 使用Live Template。

模板文本:

private final $parameterType$ $parameterName$;

public $constructorClass$(final $parameterType$ $parameterName$$parameterNameSuffix$)
    this.$parameterName$ = $parameterName$$parameterNameSuffix$;

将实时模板的“适用性”更改为:

Java > Declaration Java > Smart type completion

点击Edit variables并设置与每个变量关联的Expression如下:

参数类型:completeSmart() 参数名称:建议变量名称() constructorClass: className() 参数名称后缀:camelCase(String)

以下是一些显示它的屏幕截图:

但是,这种方法有一些注意事项(其中一些可能会影响您的用例):

它不能应用于预先存在的类,即它不能询问一个类、找到它的成员并从这些类中生成一个构造函数。相反,它是一种触发类成员声明的方式,它会在您声明类成员时即时创建构造函数。 如果您希望它支持多个类成员/构造函数参数,那么您可能必须为单个 arg 构造函数创建一个实时模板,然后将其复制用于两个 arg 构造函数,然后再复制一个用于三个 arg 构造函数等.

【讨论】:

以上是关于在 IntelliJ 中自定义 `Code` > `Generate` > `Constructor`的主要内容,如果未能解决你的问题,请参考以下文章

在IntelliJ IDE中自定义Maven Lifecycle窗口?

在 Visual Studio Code 中自定义语法突出显示

如何在 EF Core Code First 中自定义迁移生成?

VS Code中自定义Emmet代码片段

在 Tomcat 中自定义 404 页面(简单配置)

当用户在 unordered_map 中自定义哈希函数时,无法解码 g++ 中的模糊编译器错误