使用Java注释删除重复

时间:2013-07-18 17:54:30

标签: java annotations dry

是否可以使用注释减少重复次数以使代码更清晰? 我知道有可能使用java 8闭包,但尝试将其用于java 6/7

Variable x = new Variable(this,"HClass","HC"){
    @Override
    String getValue(Player p){
        return getHeroFromPlayer(p).getHeroClass().getName();
    }
};

Variable y = new Variable(this,"HSecClass","HSC"){
    @Override
    String getValue(Player p){
        return getHeroFromPlayer(p).getSecondClass().getName();
    }
};

Variable z = new Variable(this,"HLevel","HL"){
    @Override
    String getValue(Player p){
        return getHeroFromPlayer(p).getLevel();
    }
};

    Variable a = new Variable(this,"HMastered","HMa"){
    @Override
    String getValue(Player p){
        return getHeroFromPlayer(p).isMaster(getHeroFromPlayer(p).getHeroClass()) && (heroSClass == null || getHeroFromPlayer(p).isMaster(heroSClass))
                ? LocaleType.MESSAGE_HEROES_TRUE.getVal() : LocaleType.MESSAGE_HEROES_FALSE.getVal();;
    }
};

这种情况持续了一段时间,它们都被添加到地图中,这会懒洋洋地返回结果。


编辑:我希望注释可以让我按照

的方式做点什么
@Variable("HLevel","HL")
String getHLevel(){getHeroFromPlayer(p).getlevel();}

编辑: Variable.java

abstract class Variable {
final private VariableGroup vg;
final private List<String> keys = new Vector<String>();

Variable(VariableGroup vg,String...varargs){
    this.vg = vg;
    for (String s:varargs){
        keys.add(s);
    }
}


abstract String getValue(Player p);

}

2 个答案:

答案 0 :(得分:1)

根据您的评论,您可以执行类似的操作

@Variable("Primary Class")
public String getHClass(Player p) {
    return getHeroFromPlayer(p).getHeroClass().getName();
}

@Variable("Primary Class Level")
public int getHLevel(Player p) {
    return getHeroFromPlayer(p).getHLevel();
}

@Variable("Secondary Class")
public String getHSecClass(Player p) {
    return getHeroFromPlayer(p).getSecondClass().getName();
}

@Variable("Secondary Class Level")
public int getHLevel(Player p) {
    return getHeroFromPlayer(p).getHSecLevel();
}

注意:不需要所有字段都返回String。要获取此信息,您可以执行以下操作

Class heroClass = 
for(Method method : heroClass.getMethods()) {
   Variable var = method.getAnnotation(Variable.class);
   if (var == null) continue; // ignore Object.getClass()
   String description = var.value; // text to display to users
   String attributeName = method.getName().substring(3); // cut "get"
   String initials = attributeName.replaceAll("[a-z]+", "");

}

答案 1 :(得分:0)

如果没有看到变量类的代码,很难说可以改进什么。我的第一个问题是,为什么要创建匿名内部类只是为了返回 getValue 方法的值?为什么不直接向构造函数添加一个值参数并更新方法以返回该值?