我试图制作一个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,是否有解决方法?
答案 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。