如何创建与 Guava 的 Optional 一起使用的自定义 Intellij 模板设置器

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)

Aer*_*lon 3

经过一番搜索后,我发现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 的反馈编辑代码。