Intellij Idea 为什么Intellij默认的getter/setter模板会删除我的布尔变量名前缀“is”?

kiz8lqtg  于 2023-10-15  发布在  其他
关注(0)|答案(3)|浏览(217)

我有实体。我将变量定义为布尔值,并使用Intellij Idea Shortcuts创建了Getter和Setter方法。

private Boolean isForLaboratory = false;

创建后,它生成了以下内容:

public Boolean getForLaboratory() {
    return isForLaboratory;
}

public void setForLaboratory(Boolean forLaboratory) {
    isForLaboratory = forLaboratory;
}

我期望getIsForLaboratory和setIsForLaboratory。它是Java的通用约定吗?为什么Intellij删除了我的前缀?

nimxete2

nimxete21#

如果你弹出对话框GenerateGetter and Setter,你可以看到:

Getter template: IntelliJ Default
Setter template: IntelliJ Default

点击...右边的按钮,你可以看到模板代码包括以下内容:

#if ($StringUtil.startsWithIgnoreCase($name, 'is'))
  #set($name = $StringUtil.decapitalize($name))
#else
  is##

换句话说,对于以is开头的字段有特殊的处理-如果你想写自己的模板,你当然可以这样做:)
至于为什么-有一个javabean标准的布尔字段,其中一个字段名为(例如)boolean enabled的getter可以是isEnabled()而不是getEnabled(),它肯定与此有关。

2ekbmq32

2ekbmq322#

在IntelliJ版本15+中,你必须使用布尔原语来使IntelliJ生成一个带有“is”前缀的Get函数。
默认的Getter Template看起来像这样:

#if ($field.boolean && $field.primitive)
  #if ($StringUtil.startsWithIgnoreCase($name, 'is'))
    #set($name = $StringUtil.decapitalize($name))
  #else
    is##
#end

因此,在IntelliJ 15.x和更高版本中正确的方法应该是这样的:

private boolean forLaboratory = false;

自动生成后:

public boolean getForLaboratory() {
    return forLaboratory;
}

public void isForLaboratory(boolean forLaboratory) {
    this.forLaboratory = forLaboratory;
}
3pvhb19x

3pvhb19x3#

我最近在使用Spring Data MongoDB开发Sping Boot 应用程序时也遇到了这个问题。在数据库中有两个关键字。isDeleteddeleted
在我调查的时候,我发现在我的Document Java类中,isDeleted属性被暴露为getDeletedsetDeleted方法,而不是getIsDeletedsetIsDeleted。下面是文档类的一个预览:

之前

public class Book {
    private Long id;
    private String title;
    private Boolean isDeleted = false;

    public Boolean getDeleted() {
        return isDeleted;
    }

    public void setDeleted(Boolean deleted) {
        isDeleted = deleted;
    }

   // other getters and setters omitted
}

这是因为我使用了Intellij Idea的getters和setters生成特性。
我认为这可以通过修改Intellij Idea中现有的代码生成模板来轻松改变。
要添加新的自定义Getters和Setters模板,请按照以下步骤操作:

Open Any Java File > Press ALT + INS > Getters and Setters > Select ... Symbol > Press + Sign on the pop up box > Enter template name > Paste New Template > Press Save

然后,在生成getter和setter时,只需选择您的自定义模板并按ok即可。它应该能解决你的问题

之后

public class Book {
        private Long id;
        private String title;
        private Boolean isDeleted = false;
    
        public Boolean getIsDeleted() {
          return isDeleted;
        }
    
        public void setIsDeleted(Boolean isDeleted) {
          this.isDeleted = isDeleted;
        }
    
        // other getters and setters omitted
        }

以下是我的自定义模板,可以解决这个问题:
1.修改的Intellij默认Getters生成模板

#if($field.modifierStatic)
static ##
#end
$field.type ##
#if($field.recordComponent)
  ${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.name.startsWith("is"))
  getIs##
#else
  get##
#end
${name}##
#end
() {
  return $field.name;
}

1.修改的Intellij默认Setters生成模板

#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
void ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.name.startsWith("is"))
  #set ($paramName = $field.name)
  setIs##
#else
  set##
#end
${name}($field.type $paramName) {
  #if ($field.name == $paramName)
    #if (!$field.modifierStatic)
      this.##
    #else
      $classname.##
    #end
  #end
    $field.name = $paramName;
}

1.修改的生成器模式Setters生成模板

#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
static void ##
#else
  $classSignature ##
#end
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.name.startsWith("is"))
    #set ($paramName = $field.name)
setIs##
#else
set##
#end
${name}($field.type $paramName) {
#if ($field.name == $paramName)
  #if (!$field.modifierStatic)
  this.##
  #else
    $classname.##
  #end
#end
$field.name = $paramName;
#if(!$field.modifierStatic)
return this;
#end
}

相关问题