добавить вызов метода для каждого метода в классе - PullRequest
7 голосов
/ 27 марта 2012

У меня есть класс со многими методами:

public class A {
    public string method1() {
        return "method1";
    }
    public string method2() {
        return "method2";
    }
    public string method3() {
        return "method3";
    }
    .
    .
    .
    public string methodN() {
        return "methodN";
    }
}

Я хотел бы добавить вызов doSomething () в каждый метод, например:

public string methodi() {
    doSomething();
    return "methodi";
}

Каков наилучший способ сделать это? Есть ли подходящий шаблон дизайна?

Ответы [ 4 ]

7 голосов
/ 27 марта 2012

Это типичный пример использования AOP (аспектно-ориентированного программирования). Вы должны определить точки вставки для вызовов метода, и механизм AOP добавляет правильный код в файл класса. Это часто используется, когда вы хотите добавить операторы журнала, не загромождая исходные файлы.

Для Java вы можете добавить библиотеку aspectj

Для C # и .NET посмотрите этот блог . Похоже, хороший стартер.

5 голосов
/ 27 марта 2012

Использование AOP уже хороший ответ, это была и моя первая идея.

Я попытался найти хороший способ сделать это без AOP, и пришел к этой идее (используя шаблон Decorator):

interface I {
  String method1();
  String method2();
  ...
  String methodN();
}

class IDoSomethingDecorator implements I {
  private final I contents;
  private final Runnable commonAction;

  IDoSomethingDecorator(I decoratee, Runnable commonAction){
    this.contents = decoratee;
    this.commonAction = commonAction;
  }

  String methodi() {
    this.commonAction().run();
    return contents.methodi();
  }
}

Затем вы можете украсить конструкцию A (которая реализует I):

I a = new IDoSomethingDecorator(new A(),doSomething);

Это в основном не ракетостроение, и на самом деле это приводит к большему количеству кода, чем ваша первая идея,но вы можете ввести общее действие и отделить дополнительное действие от самого класса А.Кроме того, вы можете легко отключить его или использовать, например, только в тестах.

1 голос
/ 27 марта 2012

Почему бы не иметь единственную функцию?

public string methodi(int i) {
    doSomething();
    return "method" + i.toString();
}

Или вы можете написать функцию, которая принимает параметр Func, и вызывать эту функцию вместо ваших функций.

    public string Wrapper(Func<string> action)
    {
        doSomething();
        return action();
    }

и вызывайте свои функции из этой функции;

string temp = Wrapper(method1);
0 голосов
/ 27 марта 2012

Вы можете использовать отражение.

public String callMethod(int i) {
  doSomething();  
  java.lang.reflect.Method method;    
  try {
    method = this.getClass().getMethod("method" + i);
  } catch (NoSuchMethodException e) {
    // ...
  }
  String retVal = null;
  try {
    retVal = method.invoke();
  } catch (IllegalArgumentException e) {
  } catch (IllegalAccessException e) {
  } catch (InvocationTargetException e) { }
  return retVal;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...