生成Getter时如何忽略注释?

Posted

技术标签:

【中文标题】生成Getter时如何忽略注释?【英文标题】:How to ignore annotation when generating 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);
    

【问题讨论】:

【参考方案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小时......

以上是关于生成Getter时如何忽略注释?的主要内容,如果未能解决你的问题,请参考以下文章

@JsonIgnore 和 @Getter 注解

将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]

IDE 不显示 Lombok 为 Jackson 注释类生成的 getter 和 setter

IDEA设置生成带注释的getter和setter解决方案 (图文教程)

龙目岛不生成getter和setter?

如何在使用 svn 生成差异时忽略编码约定/样式?