IntelliJ Velocity模板$ Character.isUpperCase在大写char上返回false

时间:2017-03-22 14:38:20

标签: intellij-idea velocity

我试图制作一个setter模板,允许我为成员变量使用m前缀。因此,当我有一个字段mTest时,应该给我一个setter:public setTest而不是setmTest。我认为我有正确的逻辑,但即使Character.isUpperCase是大写字母,#if($Character.isUpperCase($paramName.charAt(1))) paramIsUppercase: $paramName.charAt(1) #else paramIsNotUppercase: $paramName.charAt(1) #end 也会返回false。我已经添加了一些即兴的调试,因为它有点奇怪的测试,因为IntelliJ检查是否返回了正确的函数。生成一个setter时,我得到一个错误对话框,在那里我可以看到我的输出:

#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

使用它为void setup(){ Serial.begin(19200); static char value [20] = "20:17:12"; setSimTime(value); } void setSimTime(char* incoming){ char dateTime[20]; strcat(dateTime, "20"); strcat(dateTime, incoming[0-1]); Serial.println(dateTime); } 创建一个setter时,我的调试错误

  

paramIsNotUppercase:T

为什么这会返回false,是否有解决方法?

1 个答案:

答案 0 :(得分:2)

看起来问题是$Character未定义,这意味着表达式将始终返回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 |代码生成并为 Field 指定名称前缀,并且将正确生成getter和setter。