如何从 IntelliJ getter/setter 代中删除 `get` 和 `set`

How to remove the `get` and `set` from IntelliJ getter/setter generation

假设我有一个像这样的 POJO:

public class Person {
    private String name;
}

如何让 IntelliJ 生成不带前缀 getset 的 getter 和 setter?

得到这个:

public String name() {
    return this.name;
}

public void name(String name) {
    this.name = name;
}

而不是这个:

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

免责声明: 您想要的 getter/setter 类型违反命名约定、最佳实践和 specifications(请参阅第 7 节,从第 40 页开始)。许多库,例如那些用于序列化或编组的库,需要 getFoosetFoo 类型 getters 和 setters,如果您使用这些库将不会按预期工作您要生成的 getter 和 setter 的类型。

也就是说,可以更改 IntelliJ 中的默认 getter/setter 生成。

如您所知,您可以从 IntelliJ 菜单栏 select Code|Generate,或使用 Alt+Ins 快捷方式调出生成 window。从那里,您可以 select Getter、Setter 或 Getter 和 Setter。当您 select 这些选项之一时,将打开一个对话框,显示 select 模板以及要为哪些字段生成 getters/setters。

如果您 select 模板下拉列表旁边的 ...,它将打开一个单独的模板管理对话框。

我建议使用复制图标或 Ctrl+D 快捷方式复制 IntelliJ 默认模板,并提供新的模板不同的名称,例如 'Variable Name Only'.

然后,您可以修改模板以满足您的需要。

这是 IntelliJ 默认 getter 模板:

public ##
#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
${name}() {
  return $field.name;
}

您应该能够完全删除布尔检查,因为对于您的模板,方法名称将不依赖于变量的类型。以下模板应为您提供所需的 getter:

public ##
#if($field.modifierStatic)
  static ##
#end
$field.type ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#set($name = $StringUtil.decapitalize($name))
##
${name}() {
  return $field.name;
}

这应该会给你想要的 setter:

#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
  static ##
#end
void $StringUtil.decapitalize($StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))($field.type $paramName) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
  $field.name = $paramName;
}