помогите с размышлениями и аннотациями в Java - PullRequest
0 голосов
/ 30 мая 2010

У меня проблемы с удвоением кода без какой-либо причины, кроме собственной неспособности сделать это более эффективно ...

for (Method curr: all){
        if (curr.isAnnotationPresent(anno)){
            if (anno == Pre.class){
                for (String str : curr.getAnnotation(Pre.class).value()){
                    if (str.equals(method.getName()) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0){
                        toRun.add(curr);
                    }
                }
            } if (anno == Post.class) {
                for (String str : curr.getAnnotation(Post.class).value()){
                    if (str.equals(method.getName()) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0){
                        toRun.add(curr);
                    }
                }
            }
        }
    }

anno - это параметр - Class<? extends Annotation>, а Pre и Post - мои аннотации, обе имеют value(), который представляет собой массив строк.

Конечно, это все из-за того, что я позволил Eclipse автоматически заполнить код, который я пока не понимаю.

1 Ответ

2 голосов
/ 30 мая 2010

Если под «более эффективно» вы подразумеваете «в меньшем количестве строк кода», то почему бы не объединить два оператора if? Единственное различие, которое я вижу между ними, состоит в том, что у одного есть Pre.class, где у другого - Post.class, и у вас уже есть удобная ссылка на этот класс в anno var:

for (Method curr : all) {
    if (curr.isAnnotationPresent(anno)) {
        if (anno == Pre.class || anno == Post.class){
            for (String str : curr.getAnnotation(anno).value()){
                if (str.equals(method.getName()) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0){
                    toRun.add(curr);
                }
            }
        }
    }
}

Кроме того, нет смысла выполнять внешний цикл for, если anno не является ни Pre.class, ни Post.class, поэтому вы должны делать эту проверку снаружи (это сохраняет итерации по методам, если она вызывается с аннотацией ты не хочешь). Вы также можете переместить проверки для returnType и длины параметра за пределы внутреннего цикла for (это позволит сохранить их повторение для каждого из значений и сохранить итерацию вообще, если они не соответствуют действительности).

 if (anno == Pre.class || anno == Post.class){
    for (Method curr : all) {
        if (curr.isAnnotationPresent(anno) && curr.getReturnType() == boolean.class && curr.getParameterTypes().length == 0) {
            for (String str : curr.getAnnotation(anno).value()){
                if (str.equals(method.getName())) {
                    toRun.add(curr);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...