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