我正在尝试使用Intelij模板编写一个自定义setter,但用于Google的Guava Optionals。例如,如果我有一个如下的类:
public class Note {
public Optional<String> title;
}
在Android Studio中使用默认的Setter生成输出:
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()以剥离可选的
错误
Incorrect method 'public void setTitle($StringUtil.split($field.type, true, "<").get(1) title) { mTitle = title; }
对我该怎么做有什么建议吗?
默认设置生成Setter的默认模板
#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;
}
我的自定义番石榴可选Setter Generation
#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;
}
Getter,在我的例子中,我需要大写字母的第一个字母并删除字段变量的“m”
#if($field.modifierStatic)
static ##
#end
$field.type ##
#if($field.recordComponent)
${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($StringUtil.startsWithIgnoreCase($name, 'm'))
#set($name = $name.substring(1, $name.length()))
#end
#if ($field.boolean && $field.primitive)
Is##
#else
Get##
#end
${name}##
#end
() {
return $field.name;
}
如果setter相同,请删除字段变量的“m”,param也会删除它并设置小写首字母
#set($paramName = $helper.getParamName($field, $project))
#if($field.modifierStatic)
static ##
#end
#set($functionName = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($StringUtil.startsWithIgnoreCase($paramName, 'm'))
#set($paramName = $paramName.substring(1,2).toLowerCase() + $paramName.substring(2, $paramName.length()))
#set($functionName = $functionName.substring(1))
#end
void Set$functionName ($field.type $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = $paramName;
}
示例:
private Handler mJobHandler;
吸气剂:
public Handler GetJobHandler()
{
return mJobHandler;
}
设定器:
public void SetJobHandler(Handler jobHandler)
{
mJobHandler = jobHandler;
}
经过一些搜索,我发现在StringUtils
中,拆分()
的签名与上面发布的不同。
我能够在下面为番石榴Optionals编写一个完整的解决方案来创建setter。它非常脆弱,因为我不熟悉IntelliJ中的模板,因为它依赖于包名。谷歌。常见的基础可选,也可在似乎没有正式记录的字符串上使用。
它首先检查$paramName是否是包装的可选的。如果是这样,请使用番石榴可选设置完成setter。否则,回退到默认的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;
}
编辑代码基于@ChiefTwoPencils的反馈。
我看到了您的答案,这很好,但您必须知道,您不必为每种需要的类型使用条件来使模板复杂化(即使您现在只有一种,下次呢?)。
相反,为什么不为这个特定的需要创建自己的方法,并选择何时创建这些方法呢?
我会第一个承认这可以做得更好一点;我只是想看看能不能让它正常工作。尽管如此,它并不依赖于完全限定的包名(可选);我甚至没有安装番石榴,而且它很管用。
#set($paramName = $helper.getParamName($field, $project))
public ##
#if($field.modifierStatic)
static ##
#end
void set$StringUtil.capitalizeWithJavaBeanConvention(
$StringUtil.sanitizeJavaIdentifier(
$helper.getPropertyName($field, $project)
)
)($StringUtil.trimEnd($StringUtil.substringAfter($field.type, "<"), ">") $paramName) {
#if ($field.name == $paramName)
#if (!$field.modifierStatic)
this.##
#else
$classname.##
#end
#end
$field.name = Optional.fromNullable($paramName);
}
问题内容: 我有一个基于Maven的Spring-WS客户端项目,我希望将其打包为一个jar。在日食中,一切正常运行。当我尝试将其打包为可执行jar时,由于Spring jar不包含在我的应用程序jar中,因此出现ClassNotFound异常。 因此,我添加了maven-shade-plugin以将我的所有依赖项都包含在应用程序jar中。当我查看我的应用程序jar时,会看到包含的所有依赖项中的所
我发现自己经常重复的内容。例如,对于典型的应用程序,这将如下所示: 根据执行dockerfile的项目,这里只有三件事是动态的:,,
问题内容: 我正在尝试创建一个以验证以下日期时间: 我已经尝试使用以下日期时间格式化程序来验证上述日期: 它适用于所有上述日期罚款,但根据我的要求就应该失败的。 注意:我知道使用以下格式化程序可以达到预期的结果: 但是我想知道,通过改变我们可以达到预期的结果吗? 为了解析日期,我使用以下方法: 问题答案: 您必须创建一个可选部分(使用和方法),该部分包含小数点后跟1至6位数字: 这将从解析,并引发
我是Docker和Jenkins的新手,我正在尝试创建一个Jenkins管道来构建Docker的形象。我在尝试构建时遇到了问题,并不断收到此错误: /var/jenkins_home/workspace/Docker-Pipeline@tmp/耐用-a11b32f8/脚本。sh:第1行:docker:未找到命令 我已经在虚拟机上安装了ubuntu 我正在做和他完全一样的事情,但总是失败。
我是Android系统的初学者。为了学习,我使用android Studio开发了以下UI。 屏幕上的矩形是一个文本视图,圆形是一个我可以用手绘制的区域。 textview和circle的数量是动态的。
我们有以下架构 SQS(源)->SQS轮询器->我们的业务逻辑->Sink,它从SQS中删除消息。 这是一个akka流(我们的业务逻辑有多个阶段)。 现在我们希望通过添加HTTP服务器(而不是Akka HTTP)来扩展这个体系结构。 现在我们的服务也有了路径 我认为https://doc.akka.io/docs/akka/2.5/stream/operators/source/queue.htm