Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java注释重载?_Java_Annotations_Overloading - Fatal编程技术网

Java注释重载?

Java注释重载?,java,annotations,overloading,Java,Annotations,Overloading,在我的项目中,我定义了一个类似于以下内容的注释: (为了简洁起见,省略了@保留,@目标) 自从最初编写它以来,我们的需求发生了变化,现在我定义了一个枚举,我希望能够使用它来代替字符串: public enum Particle { ELECTRON, ANTIELECTRON, NEUTRINO, ANTINEUTRINO, ... } 为了避免更新此注释的每个实例,我希望能够使用字符串或枚举粒子的成员构造注释,而无需更新此注释的每个实例以指定属性。但是

在我的项目中,我定义了一个类似于以下内容的注释:
(为了简洁起见,省略了
@保留
@目标

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

public enum Particle {
    ELECTRON,
    ANTIELECTRON,
    NEUTRINO,
    ANTINEUTRINO,
    ...
}
为了避免更新此注释的每个实例,我希望能够使用
字符串
枚举粒子
的成员构造注释,而无需更新此注释的每个实例以指定属性。但是,由于我们定义了注释的属性,而不是构造函数,因此似乎不可能重载它

// 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();
}

有没有什么方法可以做到这一点,而不需要返回并编辑大量代码?

您可以不推荐此注释,并为新代码引入一个新注释(例如@Decystoparticle)。

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

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

DecaysToV2 anno = getAnnotation( DecaysToV2.class );
if(anno = null)
{
    DecaysTo anno_old = getAnnotation( DecaysTo.class );
    if(anno_old!=null)
       anno = convert (anno_old);
}
Decystov2只是一个接口,您可以实现:

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; }
} 

也许你真正需要的是

enum Particle {
    ELECTRON("Electron"),
    ...

    private String name;
    private Particle(String name) {
        this.name = name;
    }
    public String getName() {return name;}
}
(您也可以使用字符串函数生成名称,但这种方法更灵活)


另外,我不明白有多少代码需要更改,因为(我猜)您的建议无法编译,我希望这不是您的代码实际的样子。

转换方法会是什么样子?你是说自己做一个动态代理,还是其他什么?
enum Particle {
    ELECTRON("Electron"),
    ...

    private String name;
    private Particle(String name) {
        this.name = name;
    }
    public String getName() {return name;}
}