我有一个实体。我将变量定义为布尔值,并使用 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 删除了我的前缀?
如果弹出对话框到
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()
,这肯定与此有关。
在 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;
}
我最近在使用 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 时,只需选择您的自定义模板并按“确定”。 它应该可以解决你的问题。
这是我的自定义模板,可以解决此问题:
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;
}
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;
}
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
}