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

问题描述 投票:0回答:3

我有一个实体。我将变量定义为布尔值,并使用 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 删除了我的前缀?

java intellij-idea coding-style
3个回答
8
投票

如果弹出对话框到

Generate
Getter and Setter
,你可以看到:

Getter template: IntelliJ Default
Setter template: IntelliJ Default

点击

Getter Template
右侧标有
...
的按钮,可以看到模板代码包含以下内容:

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

换句话说,对于以

is
开头的字段有特殊处理 - 如果您想编写自己的模板,您当然可以这样做:)

至于为什么 - 对于布尔字段有一个 javabean 标准,其中名为(例如)

boolean enabled
的字段的 getter 可以是
isEnabled()
而不是
getEnabled()
,这肯定与此有关。


0
投票

在 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;
}

0
投票

我最近在使用 Spring Data MongoDB 开发 Spring Boot 应用程序时也遇到了这个问题。对于 isDeleted 属性,数据库中有两个键。

isDeleted
deleted

在调查时,我发现在我的 Document java 类中,

isDeleted
属性通过
getDeleted
setDeleted
方法而不是
getIsDeleted
setIsDeleted
公开。以下是文档类的简要介绍:

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
的 getter 和 setter 生成功能。

我认为这可以通过修改

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 时,只需选择您的自定义模板并按“确定”。 它应该可以解决你的问题。

这是我的自定义模板,可以解决此问题:

  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
}
© www.soinside.com 2019 - 2024. All rights reserved.