【问题标题】:How to ignore annotation when generating Getter?生成Getter时如何忽略注释?
【发布时间】:2019-07-11 01:36:00
【问题描述】:

我创建了一个简单的 Getter 生成器来生成一个“Optional-Getter”,它将字段包装在 Optional 中。问题是当字段被注释为@Nullable 时,getter 也将使用@Nullable 生成,我发现每次生成getter 时简单地删除它非常烦人。如何忽略服装吸气剂中的字段注释?

这是我的“Optional-Getter”生成器。

#if($field.modifierStatic)
static ##
#end
Optional<$field.type> ##
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive)
  is##
#else
  get##
#end
${name}() {
  return Optional.fromNullable($field.name);
}

这就是我现在生成 getter 时的结果 -

public class Class {
    @Nullable
    private String someMember;


    @Nullable
    public Optional<String> getSomeMember() {
        return Optional.fromNullable(someMember);
    }
}

这是预期的结果 -

public class Class {
    @Nullable
    private String someMember;



    public Optional<String> getSomeMember() {
        return Optional.fromNullable(someMember);
    }
}

【问题讨论】:

    标签: java android intellij-idea code-generation


    【解决方案1】:

    通过他们的GitHub Repository &gt; Releases 获取插件CodeGenerator
    最新版本是1.3.3

    “从磁盘”安装插件,重新启动 IntelliJ/Android Studio,然后通过Settings &gt; CodeGenerator,使用此代码修改默认的Getter and Setter 模板,并启用

    #foreach($field in $fields)
    #set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field.element, $project))))
    #if ($field.boolean && $field.primitive)
    #set($getter = "is${name}")
    #else
    #set($getter = "get${name}")
    #end
    #set($setter = "set${name}")
    #if($field.modifierStatic)
    static ##
    #end
    
    #if($field.modifierStatic)
    static ##
    #end
    Optional<$field.type> ##
    ${getter}() {
      return Optional.fromNullable($field.name);
    }
    
    #if($field.modifierStatic)
    static ##
    #end
    void ${setter}($field.type $paramName) {
    #if ($field.name == $paramName)
        #if (!$field.modifierStatic)
        this.##
        #else
            $classname.##
        #end
    #end
    $field.name = $paramName;
    }
    #end 
    

    您可以通过Alt+ins(或Code &gt; Generate)使用它

    根据需要自定义您的模板,或添加新模板。享受;)


    这也是我在为 IDEA 寻找的东西。其实很久以来。不幸的是,到目前为止,它似乎无法参数化。

    这是 YouTrack 问题,它使 @Nullable@NotNull 自动插入到生成的 getter/setter 中可用

    https://youtrack.jetbrains.net/issue/IDEA-30683

    如果可能,您可以投票支持自动转换为 Optional&lt;T&gt; getter 的功能

    https://youtrack.jetbrains.net/issue/IDEA-201804

    您可以投票支持将注释公开给 Apache Velocity 模板的功能

    https://youtrack.jetbrains.net/issue/IDEA-176763

    【讨论】:

    • 所以他们添加了这个自动注释生成作为一项功能,但没有提供取消/修改它的选项?
    • @OfekRegev 完全正确。但他们站在“好的一面”。可能他们没有考虑您的用例。请记住,Optional 是一个相对较新的标准功能。
    • 我认为他们实际上是在寻找简单的解决方案,当然这并不是在 Apache Velocity 模板中添加注释......
    • @OfekRegev 如果您对插件开发感兴趣,您也许可以创建自己的 getter 和 setter 生成器。
    • 我对开发很多东西很感兴趣,可惜一天只有24小时......
    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2019-10-13
    • 2016-05-22
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多