2024-01-10  阅读(2)
原文作者:猫巳 原文地址: https://moonce.blog.csdn.net/article/details/122213785

一、实验性功能说明

onX是在lombok v0.11.8中作为实验性功能引入的。

实验因为:

  • 丑陋的语法。这个功能的语法不是最佳的,但它是可能工作的最不曲折的语法(目前!)。
  • 可能java 9会提供(更多)更好的方式来支持这个功能。
  • 不确定因素。未来版本的javac可能会破坏这个功能,我们可能无法恢复它。

当前状态:不确定–目前我们觉得这个功能不能脱离实验状态。

二、简介

这个功能被认为是 “变通状态”–它的存在是为了让那些没有这个功能就无法工作的lombok用户无论如何都能使用这个功能。如果我们找到一个更好的方法来实现这个功能,或者未来的某个java版本引入了一个替代策略,这个功能可以在没有一个合理的废弃期的情况下消失。另外,这个功能可能在未来的javac版本中无法使用。使用时请自行斟酌。

大多数使lombok生成方法或构造函数的注解可以被配置为使lombok在生成的代码中的元素上添加自定义注解。

@Getter@Setter@Wither支持onMethod选项,这将把列出的注释放在生成的方法上。

@AllArgsConstructor@NoArgsConstructor@RequiredArgsConstructor支持onConstructor选项,它将把列出的注释放在生成的构造函数上。

除了onMethod之外,@Setter@Wither还支持onParam;列出的注解将被放在生成的方法的唯一参数上。@EqualsAndHashCode也支持onParam;列出的注释将被放置在生成的equals方法的唯一参数上,以及任何生成的canEqual方法。

语法有点奇怪,取决于你所使用的javac

javac7上,要使用3个onX特性中的任何一个,你必须用@__(@AnnotationGoesHere)来包装要应用到构造函数/方法/参数的注释。要应用多个注释,请使用@__({@Annotation1, @Annotation2})。注释本身显然也可以有参数。

javac8及以上版本中,你可以在onMethodonParamonConstructor后面加一个下划线。

三、示例比较

1. Lombok 写法

    
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.inject.Inject;
    import javax.persistence.Id;
    import javax.persistence.Column;
    import javax.validation.constraints.Max;
    
    @AllArgsConstructor(onConstructor=@__(@Inject))
    public class OnXExample {
    //  @Getter(onMethod=@__({@Id, @Column(name="unique-id")})) //JDK7
    //  @Setter(onParam=@__(@Max(10000))) //JDK7
      @Getter(onMethod_={@Id, @Column(name="unique-id")}) //JDK8
      @Setter(onParam_=@Max(10000)) //JDK8
      private long unid;
    }

2. Java 标准写法

    
    import javax.inject.Inject;
    import javax.persistence.Id;
    import javax.persistence.Column;
    import javax.validation.constraints.Max;
    
    public class OnXExample {
      private long unid;
    
      @Inject
      public OnXExample(long unid) {
        this.unid = unid;
      }
    
      @Id @Column(name="unique-id")
      public long getUnid() {
        return unid;
      }
    
      public void setUnid(@Max(10000) long unid) {
        this.unid = unid;
      }
    }

四、支持的配置项

lombok.onX.flagUsage = [warning | error] (默认: not set)
如果已配置,Lombok会将onX的任何使用标记为警告或错误。

五、附属说明

这个奇怪的语法的原因是为了让这个功能在javac 7编译器中工作;@__类型是对注解类型__(双下划线)的注解引用,它实际上并不存在;这使得javac 7由于错误而延迟中止编译过程,因为有可能一个注解处理器后来会创建__类型。相反,lombok应用了注解并删除了引用,这样错误就不会真正发生。重点是。__类型必须不存在,否则这个特性就不能工作。在罕见的情况下,__类型确实存在(并且被导入或在包中),你可以简单地添加更多的下划线。技术上来说,任何不存在的类型都可以工作,但是为了保持一致性和可读性,并捕捉错误的使用,如果’wrapper'注解除了一系列下划线之外,lombok认为这是一个错误。

javac8中,上述功能应该工作,但是由于javac8中的一个bug,它没有工作。然而,从javac8开始,如果参数名在注解类型中不存在,编译会进行到lombok可以修复它的阶段。

重申:这一特征随时可能消失;如果您使用此功能,当我们找到更好的实现此功能的方法时,或者如果javac的未来版本迫使我们在没有其他选择的情况下完全删除此功能时,请准备好调整代码。

onX参数在任何类型范围的变体上都是不合法的。例如,一个类上的@Getter注解不支持onMethod

参考文献

【1】onX | Sup dawg, we heard you like annotations, so we put annotations in your annotations so you can annotate while you’re annotating.


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文