加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java注释重载?

发布时间:2020-12-15 08:35:15 所属栏目:Java 来源:网络整理
导读:在我的项目中,我已经定义了类似于以下内容的注释: (省略@Retention,@ Target为了简洁) public @interface DecaysTo { String[] value();} 自从最初编写它以来,我们的需求已经改变,我现在已经定义了一个我希望能够用来代替字符串的枚举: public enum Partic
在我的项目中,我已经定义了类似于以下内容的注释:
(省略@Retention,@ Target为了简洁)

public @interface DecaysTo {
    String[] value();
}

自从最初编写它以来,我们的需求已经改变,我现在已经定义了一个我希望能够用来代替字符串的枚举:

public enum Particle {
    ELECTRON,ANTIELECTRON,NEUTRINO,ANTINEUTRINO,...
}

为了避免更新此批注的每个实例,我希望能够使用String或枚举粒子的成员构造批注,而无需更新此批注的每个实例以指定属性.但是,由于我们定义了注释的属性,而不是构造函数,因此似乎不可能重载它.

// In a perfect world,either of these would work ...
public @interface DecaysTo {
    String[] value();
    Particle[] value();
}

@DecaysTo({"Electron",...})
@DecaysTo({Particle.ELECTRON,...})

// without having to explicitly specify which attribute to set:
public @interface DecaysTo {
    String[] stringVals();
    Particle[] enumVals();
}

@DecaysTo(stringVals = {"Electron",...})
@DecaysTo(enumVals = {Particle.ELECTRON,...})

还试图:

public @interface DecaysTo {
    Object[] value();
}

有没有办法做到这一点,不涉及返回和编辑大量的代码?

解决方法

最好的方法是查找并替换以前的所有注释.你不希望旧的设计挥之不去.在整个重构过程中保持干净的代码库.

假设您不想这样做,或者您不拥有使用注释的代码,则应保留两种注释类型.在您的注释处理代码中,您查找两者,如果使用旧的,则将其转换为新的.

DecaysToV2 anno = getAnnotation( DecaysToV2.class );
if(anno = null)
{
    DecaysTo anno_old = getAnnotation( DecaysTo.class );
    if(anno_old!=null)
       anno = convert (anno_old);
}

DecaysToV2只是一个你可以提出的接口:

DecaysToV2 convert( DecaysTo old )
{
    DecaysToV2Impl impl = new DecaysToV2Impl();
    impl.value = ...
    return impl;
}
static class DecaysToV2Impl implements DecaysToV2
{
    Particle[] value;
    public Particle[] value(){ return this.value; }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读