Aer*_*lon 5 java android templates intellij-idea guava
我正在尝试使用 Intelij 模板编写自定义设置器,但用于 Google 的 Guava Optionals。例如,如果我有一个类如下:
public class Note {
public Optional<String> title;
}
Run Code Online (Sandbox Code Playgroud)
使用SetterAndroid Studio 输出中的默认生成:
public class Note {
public Optional<String> title;
public void setTitle(Optional<String> title) {
this.title = title;
}
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是:
public class Note {
public Optional<String> title;
public void setTitle(String title) {
this.title = Optional.fromNullable(title);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我所尝试的是复制 Intelij 的模板并StringUtil.split()用于剥离Optional<方法签名的一部分。但是,当我使用下面的模板时出现错误。
错误
Incorrect method 'public void setTitle($StringUtil.split($field.type, true, "<").get(1) title) { mTitle = title; }
Run Code Online (Sandbox Code Playgroud)
关于我应该做什么的任何建议?
Intelij DefaultSetter 生成的默认模板
#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;
}
Run Code Online (Sandbox Code Playgroud)
我的自定义 Guava Optional 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;
}
Run Code Online (Sandbox Code Playgroud)
经过一番搜索后,我发现StringUtils,split()的签名与上面发布的不同。
我能够编写一个完整的解决方案来为下面的 Guava Options 创建一个 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;
}
Run Code Online (Sandbox Code Playgroud)
根据@ChiefTwoPencils 的反馈编辑代码。
| 归档时间: |
|
| 查看次数: |
1750 次 |
| 最近记录: |