10

有没有办法让 IntelliJ 对它生成的 getter/setter 更聪明?特别是,如果字段名称中包含下划线,getter 可以将它们剥离并转换为 CamelCase 吗?

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

public class Taco {
  private String carne_asada;

  public String getCarne_asada() {
    return carne_asada;
  }
}

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

4

2 回答 2

13

您可以使用实时模板来完成此操作。它不能从代码生成中访问,但它仍然很容易使用。

我创建了一个带有属性的 Main 类carne_asada

在此处输入图像描述

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

在此处输入图像描述

按底部调用的小链接Define来定义此模板何时有效。然后选择Java | Declaration

在此处输入图像描述

按下按钮Edit Variables打开一个窗口,可以在其中定义每个实时模板变量。现在创建以下变量:

VAR         : suggestFirstVariableName("Object")
TYPE        : typeOfVariable(VAR)
CAP_CAM_VAR : capitalize(underscoresToCamelCase(VAR))

顺序非常重要,所以VAR必须先来。在我的示例CAP_CAM_VAR中,代表 Capitalize 和 CamelCaseVAR变量。Skip if defined根据图片设置:

在此处输入图像描述

现在再次按OKOK返回编辑器。

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

在此处输入图像描述

在此处输入图像描述

按一下Enter,getter 生成就完成了:

在此处输入图像描述

现在,如果您有更多带有下划线的变量,您将获得一个可供选择的列表,因此这里有一个示例:

在此处输入图像描述

结果很漂亮:

在此处输入图像描述

您可以轻松地创建相同的setu实时模板,也许还sgetu可以同时创建它们。

希望这会有所帮助!

于 2013-05-29T07:41:51.477 回答
8

以下是在 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;
}

如果你想要上面的流利的 getter/setter,请参考我的要点。

https://gist.github.com/k24/72d0be3d76d4eb987c6d4eb1d8f42db2

于 2017-01-12T14:18:00.170 回答