我正在尝试使用Intelij Template编写一个自定义的setter,但要使用Google的Guava Optionals。例如,如果我有如下课程:
public class Note {
public Optional<String> title;
}
Setter
在Android Studio输出中使用默认生成:
public class Note {
public Optional<String> title;
public void setTitle(Optional<String> title) {
this.title = title;
}
}
我想要实现的是:
public class Note {
public Optional<String> title;
public void setTitle(String title) {
this.title = Optional.fromNullable(title);
}
}
到目前为止,我一直在尝试复制Intelij的模板,并使用StringUtil.split()
其剥离Optional<
方法签名的一部分。但是,使用下面的模板时出现错误。
错误
Incorrect method 'public void setTitle($StringUtil.split($field.type, true, "<").get(1) title) { mTitle = title; }
关于我应该做什么的任何建议?
Intelij Default
设置器生成的默认模板
#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = $paramName;
}
我的自定义Guava可选二传手
#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($StringUtil.split($field.type, true, "<").get(1) $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = $paramName;
}
某些搜索后,我发现StringUtils
,split()
有超过张贴上述不同的签名。
我能够编写一个完整的解决方案,为下面的Guava Optionals创建一个setter。由于我是IntelliJ模板的新手,它非常脆弱,因为它依赖于程序包名称,com.google.common.base.Optional
而且还依赖于StringsUtils
正式的文档。
它首先检查是否$paramName
被包装Optional
。如果是这样,请使用Guava可选设置完成设置器。否则,回退到默认的IntelliJ setter。
#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
static ##
#end
#if($StringUtil.split($field.type, "<").get(0).equals("com.google.common.base.Optional"))
#set($paramSignature = $StringUtil.trimEnd($StringUtil.substringAfter($field.type, "<"), ">"))
#set($fieldAssignment = "Optional.fromNullable(" + $paramName + ")")
#else
#set($paramSignature = $field.type)
#set($fieldAssignment = $paramName)
#end
void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($paramSignature $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = $fieldAssignment;
}
EDITED基于从@ChiefTwoPencils反馈的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句