IntelliJ Velocity 模板 $Character.isUpperCase return false on uppercase char
IntelliJ Velocity template $Character.isUpperCase return false on uppercase char
我正在尝试制作一个 setter 模板,它允许我为成员变量使用 m 前缀。因此,当我有一个字段 mTest
时,应该给我一个 setter:public setTest
而不是 setmTest
。我认为我的逻辑是正确的,但是 Character.isUpperCase
returns false 即使它是大写字母。我添加了一些即兴调试,因为测试起来有点奇怪,因为 IntelliJ 检查是否返回了正确的函数。生成 setter 时出现一个错误对话框,我可以在其中看到我的输出:
#if($Character.isUpperCase($paramName.charAt(1)))
paramIsUppercase: $paramName.charAt(1)
#else
paramIsNotUppercase: $paramName.charAt(1)
#end
完整代码:
#set($paramName = $helper.getParamName($field, $project))
// debugging
#if($Character.isUpperCase($paramName.charAt(1)))
paramIsUppercase: $paramName.charAt(1)
#else
paramIsNotUppercase: $paramName.charAt(1)
#end
#if($StringUtil.startsWith($paramName, 'm') && $Character.isUpperCase($paramName.charAt(1)))
#set($paramName = $paramName.substring(1))
#end
#set($paramName = $StringUtil.decapitalize($paramName))
public ##
#if($field.modifierStatic)
static void ##
#else
$classname ##
#end
set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($paramName))($field.type $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = $paramName;
#if(!$field.modifierStatic)
return this;
#end
}
当使用它为 mTest
创建 setter 时,我的调试出现错误
paramIsNotUppercase: T
为什么会返回 false,是否有解决方法?
看起来问题是 $Character
没有定义,这意味着表达式总是 return false
。有一种方法可以解决这个问题。这是一个可怕的黑客,但它对我有用。使用以下模板行。
## get some object
#set($String='')
## abuse it to obtain the desired jdk class
#set($Character=$String.class.forName('java.lang.Character'))
之后您可以根据需要定期使用 $Character
(即 $Character.isUpperCase($paramName.charAt(1))
)。
但是,如果您想为字段使用前缀,则无需创建自己的 setter 模板。只需转到设置 文件 |设置 |编辑|代码风格 | Java |代码生成并为字段指定一个名称前缀,getters和setters将被正确生成。
我正在尝试制作一个 setter 模板,它允许我为成员变量使用 m 前缀。因此,当我有一个字段 mTest
时,应该给我一个 setter:public setTest
而不是 setmTest
。我认为我的逻辑是正确的,但是 Character.isUpperCase
returns false 即使它是大写字母。我添加了一些即兴调试,因为测试起来有点奇怪,因为 IntelliJ 检查是否返回了正确的函数。生成 setter 时出现一个错误对话框,我可以在其中看到我的输出:
#if($Character.isUpperCase($paramName.charAt(1)))
paramIsUppercase: $paramName.charAt(1)
#else
paramIsNotUppercase: $paramName.charAt(1)
#end
完整代码:
#set($paramName = $helper.getParamName($field, $project))
// debugging
#if($Character.isUpperCase($paramName.charAt(1)))
paramIsUppercase: $paramName.charAt(1)
#else
paramIsNotUppercase: $paramName.charAt(1)
#end
#if($StringUtil.startsWith($paramName, 'm') && $Character.isUpperCase($paramName.charAt(1)))
#set($paramName = $paramName.substring(1))
#end
#set($paramName = $StringUtil.decapitalize($paramName))
public ##
#if($field.modifierStatic)
static void ##
#else
$classname ##
#end
set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($paramName))($field.type $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = $paramName;
#if(!$field.modifierStatic)
return this;
#end
}
当使用它为 mTest
创建 setter 时,我的调试出现错误
paramIsNotUppercase: T
为什么会返回 false,是否有解决方法?
看起来问题是 $Character
没有定义,这意味着表达式总是 return false
。有一种方法可以解决这个问题。这是一个可怕的黑客,但它对我有用。使用以下模板行。
## get some object
#set($String='')
## abuse it to obtain the desired jdk class
#set($Character=$String.class.forName('java.lang.Character'))
之后您可以根据需要定期使用 $Character
(即 $Character.isUpperCase($paramName.charAt(1))
)。
但是,如果您想为字段使用前缀,则无需创建自己的 setter 模板。只需转到设置 文件 |设置 |编辑|代码风格 | Java |代码生成并为字段指定一个名称前缀,getters和setters将被正确生成。