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

航空梯队

我正在尝试使用Intelij Template编写一个自定义的setter,但要使用Google的Guava Optionals。例如,如果我有如下课程:

public class Note {
    public Optional<String> title;
}

Setter在Android Studio输出中使用默认生成:

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<方法签名一部分。但是,使用下面的模板时出现错误。

错误

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

关于我应该做什么的任何建议?

Intelij Default设置器生成的默认模板

#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可选二传手

#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;
}
航空梯队

某些搜索后,我发现StringUtilssplit()有超过张贴上述不同的签名。

我能够编写一个完整的解决方案,为下面的Guava Optionals创建一个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;
}

EDITED基于从@ChiefTwoPencils反馈的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将自定义类与自定义模板容器一起使用

来自分类Dev

与模板模板类一起使用的自定义模板参数活页夹

来自分类Dev

如何与传单一起使用自定义创建的地图框样式

来自分类Dev

将Guava Range与自定义对象一起使用

来自分类Dev

如何使自定义键盘与Swift一起使用

来自分类Dev

如何在sklearn中将GridSearchCV与自定义估算器一起使用?

来自分类Dev

如何将 lodash sortBy 与自定义订单比较器一起使用

来自分类Dev

如何将 Firebase 存储与自定义服务器一起使用?

来自分类Dev

如何在Azure Notification Hub中将推送通知模板与多个自定义属性一起使用?

来自分类Dev

如何在Azure Notification Hub中将推送通知模板与多个自定义属性一起使用?

来自分类Dev

使Bootstrap Popover与自定义HTML模板一起使用

来自分类Dev

将LoginView和LogoutView与自定义模板一起使用

来自分类Dev

模板可以与 Aurelia 中的自定义属性一起使用吗?

来自分类Dev

如何将自定义删除器与std :: unique_ptr成员一起使用?

来自分类Dev

如何在C ++ 11中将std :: max与自定义比较器一起使用?

来自分类Dev

如何使用自定义比较器功能将所有字谜分组在一起?

来自分类Dev

将休眠验证器与自定义消息源一起使用时如何转义参数

来自分类Dev

如何在ExtJS中创建自定义SASS以与Sencha CMD一起编译

来自分类Dev

如何在ExtJS中创建自定义SASS以与Sencha CMD一起编译

来自分类Dev

实现自定义迭代器以与std :: sort一起使用

来自分类Dev

GridSearchCV可以与自定义分类器一起使用吗?

来自分类Dev

将std :: make_unique与自定义删除器一起使用

来自分类Dev

将我的自定义迭代器与stl算法一起使用

来自分类Dev

将AppRTC与自定义服务器一起使用

来自分类Dev

将Lemon解析器与自定义标记值一起使用

来自分类Dev

将加载的Keras分类器与自定义指标功能一起使用时出错

来自分类Dev

Django Rest-将@action与自定义装饰器一起使用

来自分类Dev

将AppRTC与自定义服务器一起使用

来自分类Dev

将Lemon解析器与自定义标记值一起使用

Related 相关文章

  1. 1

    将自定义类与自定义模板容器一起使用

  2. 2

    与模板模板类一起使用的自定义模板参数活页夹

  3. 3

    如何与传单一起使用自定义创建的地图框样式

  4. 4

    将Guava Range与自定义对象一起使用

  5. 5

    如何使自定义键盘与Swift一起使用

  6. 6

    如何在sklearn中将GridSearchCV与自定义估算器一起使用?

  7. 7

    如何将 lodash sortBy 与自定义订单比较器一起使用

  8. 8

    如何将 Firebase 存储与自定义服务器一起使用?

  9. 9

    如何在Azure Notification Hub中将推送通知模板与多个自定义属性一起使用?

  10. 10

    如何在Azure Notification Hub中将推送通知模板与多个自定义属性一起使用?

  11. 11

    使Bootstrap Popover与自定义HTML模板一起使用

  12. 12

    将LoginView和LogoutView与自定义模板一起使用

  13. 13

    模板可以与 Aurelia 中的自定义属性一起使用吗?

  14. 14

    如何将自定义删除器与std :: unique_ptr成员一起使用?

  15. 15

    如何在C ++ 11中将std :: max与自定义比较器一起使用?

  16. 16

    如何使用自定义比较器功能将所有字谜分组在一起?

  17. 17

    将休眠验证器与自定义消息源一起使用时如何转义参数

  18. 18

    如何在ExtJS中创建自定义SASS以与Sencha CMD一起编译

  19. 19

    如何在ExtJS中创建自定义SASS以与Sencha CMD一起编译

  20. 20

    实现自定义迭代器以与std :: sort一起使用

  21. 21

    GridSearchCV可以与自定义分类器一起使用吗?

  22. 22

    将std :: make_unique与自定义删除器一起使用

  23. 23

    将我的自定义迭代器与stl算法一起使用

  24. 24

    将AppRTC与自定义服务器一起使用

  25. 25

    将Lemon解析器与自定义标记值一起使用

  26. 26

    将加载的Keras分类器与自定义指标功能一起使用时出错

  27. 27

    Django Rest-将@action与自定义装饰器一起使用

  28. 28

    将AppRTC与自定义服务器一起使用

  29. 29

    将Lemon解析器与自定义标记值一起使用

热门标签

归档