Intellij idea IntelliJ:为名称中带有下划线的字段生成getter/setter

Intellij idea IntelliJ:为名称中带有下划线的字段生成getter/setter,intellij-idea,Intellij Idea,有没有办法让IntelliJ对它生成的getter/setter更聪明?特别是,如果字段名中有下划线,getter能否将其去掉并转换为CamelCase 例如,我希望下面的getter是getCarneAsada(): 我找到了code-Style->Java->code-Generation区域,但没有一个选项是合适的……我不想排除前缀或后缀。它是内部下划线。您可以使用活动模板来完成此操作。它将无法从代码生成中访问,但仍然非常易于使用 我创建了一个具有属性carne_asada的主类: 现在

有没有办法让IntelliJ对它生成的getter/setter更聪明?特别是,如果字段名中有下划线,getter能否将其去掉并转换为CamelCase

例如,我希望下面的getter是getCarneAsada():


我找到了
code-Style->Java->code-Generation
区域,但没有一个选项是合适的……我不想排除前缀或后缀。它是内部下划线。

您可以使用活动模板来完成此操作。它将无法从代码生成中访问,但仍然非常易于使用

我创建了一个具有属性
carne_asada
的主类:

现在在设置中打开
Live Templates
,并在
other
下创建一个名为
getu
的新模板:

按下底部名为
Define
的小链接,定义此模板何时有效。然后选择
Java | Declaration

按按钮
编辑变量
打开一个窗口,可以在其中定义每个活动模板变量。现在创建以下变量:

VAR         : suggestFirstVariableName("Object")
TYPE        : typeOfVariable(VAR)
CAP_CAM_VAR : capitalize(underscoresToCamelCase(VAR))
顺序非常重要,因此
VAR
必须放在第一位。在我的示例中,
CAP\u CAM\u VAR
代表大写,CamelCase代表
VAR
变量。根据图像设置
跳过(如果已定义)

现在再次按
OK
OK
返回编辑器

通过键入
getu
尝试新的
getu
实时模板,然后按Tab:

按Enter键,getter生成已完成:

现在,如果您有更多带下划线的变量,您将得到一个列表供您选择,下面是一个示例:

结果非常漂亮:

您可以轻松创建相同的
setu
live模板,也可以创建一些同时创建这两个模板的
sgetu


希望这有点帮助

以下是在IntelliJ IDEA 2016和Android Studio 2.2下生成getter/setter的模板

骆驼化吸气剂:

#if($field.modifierStatic)
static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
  #if ($StringUtil.startsWithIgnoreCase($name, 'is'))
    #set($name = $StringUtil.decapitalize($name))
  #else
    is##
#end
#else
  get##
#end
#set($words = $StringUtil.split($name, "_"))
#set($name = "")
#foreach($word in $words)
#set($name = $name + $StringUtil.capitalize($word))
#end
${name}() {
  return $field.name;
}
驼峰塞特:

#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#set($words = $StringUtil.split($name, "_"))
#set($name = "")
#foreach($word in $words)
#set($name = $name + $StringUtil.capitalize($word))
#end
void set$name($field.type $StringUtil.decapitalize($name)) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
  $field.name = $paramName;
}
如果你想流利地掌握上述知识,请参考我的GITS


您可以(应该?)将字段重命名为
carneAsada
。IntelliJ也会自动重命名它的getter和setter,我不想使用神奇的FieldNamingPolicy.LOWER_CASE_和_下划线这里没有选项告诉IntelliJ IDEA在生成getter/setter时以不同的方式对待下划线,因为这违反了Java命名约定。@CrazyCoder是否有任何愿望列表,人们可以投票选择访问getter/setter模板进行定制?类似于我答案中的实时模板?@maba,是的,请看。感谢您的全面解释!我希望在使用普通的“生成getter/setter”函数时得到它,但它听起来好像@CrazyCoder不认为这是可能的。@Eric不,显然现在还不可能。希望JetBrains能够为代码生成打开模板,以便能够对其进行自定义。仅供参考:对于那些在驼峰大小写字段名称前加下划线(例如,
\u fooBar
)的用户,您可以使用
大写(下划线驼峰大小写(snakeCase(VAR)))
作为
CAP\u CAM\u VAR
的表达式,创建
getFooBar()
谢谢!除了camellized Setter中的一个小错误外,代码正常工作。最后一行应该是
$field.name=$StringUtil.decapitalize($name)
,以便您设置的字段与函数的参数匹配。
#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#set($words = $StringUtil.split($name, "_"))
#set($name = "")
#foreach($word in $words)
#set($name = $name + $StringUtil.capitalize($word))
#end
void set$name($field.type $StringUtil.decapitalize($name)) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
  $field.name = $paramName;
}