Java 如何创建用于Guava';这是可选的

Java 如何创建用于Guava';这是可选的,java,android,templates,intellij-idea,guava,Java,Android,Templates,Intellij Idea,Guava,我试图编写一个自定义设置使用Intelij模板的,但谷歌的番石榴选项。例如,如果我有一个类,如下所示: public class Note { public Optional<String> title; } 我想要实现的是: public class Note { public Optional<String> title; public void setTitle(String title) { this.title = O

我试图编写一个自定义设置使用Intelij模板的,但谷歌的番石榴选项。例如,如果我有一个类,如下所示:

public class Note {
    public Optional<String> title;
}
我想要实现的是:

public class Note {
    public Optional<String> title;

    public void setTitle(String title) {
        this.title = Optional.fromNullable(title);
    } 
}
我该怎么做有什么建议吗

默认值
Intelij默认值
用于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;
}
#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;
}
我的自定义番石榴可选设置生成

#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;
}
#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;
}
#set($paramName=$helper.getParamName($field,$project))
公开的##
#如果($field.modifierStatic)
静止的##
#结束

无效集$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field,$project)))($StringUtil.split($field.type,true,“在搜索之后,我发现,
split()
中的签名与上面发布的签名不同

我能够在下面编写一个完整的解决方案,为番石榴Optionals创建一个setter。它非常脆弱,因为我不熟悉IntelliJ中的模板,因为它依赖于包名
com.google.common.base.Optional
,也依赖于似乎没有正式文档记录的

它首先检查
$paramName
是否是包装的
可选设置
。如果是,请使用Guava可选设置完成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;
}
#set($paramName=$helper.getParamName($field,$project))
公开的##
#如果($field.modifierStatic)
静止的##
#结束

#如果($StringUtil.split($field.type),我看到了您的答案,这很好,但您必须知道,您不必为每种需要的类型使用条件使模板复杂化(即使您现在只有一个;下次呢?)

相反,为什么不为这个特定的需求创建自己的方法,并选择何时创建这些方法呢

我会第一个承认这可以做得更好一点;我只是想看看我是否能让它正常工作。尽管如此,它并不依赖于
Optional
的完全限定包名;我甚至没有安装Guava,它也可以工作

#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);
}
#set($paramName=$helper.getParamName($field,$project))
公开的##
#如果($field.modifierStatic)
静止的##
#结束
无效设置$StringUtil.CapitalWithJavaBeanConvention(
$StringUtil.sanitizeJavaIdentifier(
$helper.getPropertyName($field,$project)
)
)($StringUtil.trimEnd($StringUtil.substringAfter($field.type,“”)$paramName){
#如果($field.name==$paramName)
#if(!$field.modifierStatic)
这个##
#否则
$classname##
#结束
#结束
$field.name=可选。fromNullable($paramName);
}

你能告诉我你到底收到了什么错误吗?@thst我已经更新了上面的帖子。具体来说,该方法从未生成,并且显示了一个带有以下内容的红色气泡:
不正确的方法“public void setTitle($StringUtil.split($field.type,true),"sou在哪里找到了$StringUtil?它没有afaics文档。你可以使用groovy代码来完成字符串操作。但是没有相关的示例。是的,我不太确定在哪里可以找到任何字符串操作文档。我快速搜索了
jetbrain StringUtil capitalizeWithJavaBeanConvention
,发现了以下内容:。。。在那里,您可以找到
StringUtil.split()
的签名。如果没有其他内容,我建议,如果您不遵循我在答案中的建议,您可以重新排列代码,以减少重复,因为大部分代码都是不必要的。@chieftwoils完成了。如果有任何其他优化,请随时提出建议–谢谢!