【问题标题】:How to create a custom Intellij template setter for use with Guava's Optional如何创建自定义 Intellij 模板设置器以与 Guava 的 Optional 一起使用
【发布时间】:2016-06-02 11:50:19
【问题描述】:

我正在尝试使用 Intelij 模板编写自定义设置器,但用于 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() 去除方法签名的 Optional&lt; 部分。但是,我在使用下面的模板时遇到了错误。

错误

Incorrect method 'public void setTitle($StringUtil.split($field.type, true, "<").get(1) title) { mTitle = title; }

对我应该做什么有什么建议吗?

默认Intelij Default 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;
}

我的自定义 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;
}

【问题讨论】:

  • 你能告诉我你收到了什么错误吗?
  • @thst 我已经更新了上面的帖子。具体来说,该方法永远不会生成,并显示一个带有以下内容的红色气泡:Incorrect method 'public void setTitle($StringUtil.split($field.type, true, "&lt;").get(1) title) { mTitle = title; }
  • 你在哪里找到 $StringUtil?它没有记录在案。您可以使用 groovy 代码来完成字符串操作。但是没有样本。
  • 是的,我不太确定在哪里可以找到任何字符串操作的文档。我快速搜索了jetbrain StringUtil capitalizeWithJavaBeanConvention,发现了这个:javadoc.jetbrains.net/teamcity/openapi/8.0/jetbrains/… ...在那里你可以找到StringUtil.split()的签名

标签: java android templates intellij-idea guava


【解决方案1】:

经过一番搜索,我发现StringUtilssplit() 的签名与上面发布的不同。

我能够编写一个完整的解决方案来为下面的 Guava Optionals 创建一个设置器。它非常脆弱,因为我是 IntelliJ 模板的新手,因为它依赖于包名称 com.google.common.base.Optional 以及似乎没有正式记录的 StringsUtils

它首先检查$paramName 是否是一个包装的Optional。如果是这样,请使用 Guava 可选设置完成设置器。否则,回退到默认的 IntelliJ 设置器。

#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 的反馈。

【讨论】:

  • 如果没有别的,我建议,如果你不按照我在答案中的建议,你重新排列代码以减少重复,因为大部分都是不必要的。
  • @ChiefTwoPencils 完成。如果还有其他优化,请随时提出建议 - 谢谢!
【解决方案2】:

我看到了你的答案,这很好,但你必须知道你不必为你需要的每种类型使用条件句来使模板复杂化(即使你现在只有一个;下一次呢?)。

相反,为什么不针对这种特定需求创建自己的方法并选择何时创建方法?

我会第一个承认这可以做得更好;我只是想看看我是否能让它正常工作。尽管如此,它并不依赖于完全限定的包名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);
}

【讨论】:

    【解决方案3】:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多