Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Интерфейс, смена содержания метода на лету..


Автор: Viroman 1.5.2012, 12:55
Здравствуйте,

есть программа с интерфейсом, где та программа вызывает методы, содержание которых указываю я.. К той программе у меня нет доступа..
Вот и вопрос, покуда ограничен тем, что исходники той программы трогать не могу, а лишь свои.
Представим ситуацию..

Цитата

public void mymethod(String a) {
 if(a.startsWith('something')) {
   dothis();
 } else {
   dothose();
 }
}


Это для наглядности, и надо представить, что этот метод вызывается многократно, миллионы раз, но проверять a.startsWith('something')
мне нужно лишь единожды в самом начале, последующие миллионы вызовов в этом нет необходимости, только излишнее пожирание ресурсов..
Так вот, возможно ли на лету переписывать свои же методы в своём же классе?
Типа было
Цитата

public void mymethod(String a) {
 if(a.startsWith('something')) {
   dothis();
 } else {
   dothose();
 }
}

проверило разочек,
а потом переписывается на лету этот же метод в
Цитата

public void mymethod(String a) {
   dothose();
}


Вот такое возможно ли? Если да, то как именно на наглядных примерах пожалуйста?!
Спасибо большое заранее!!!

Автор: Stolzen 2.5.2012, 09:20
Попробуйте использовать паттерн стратегия

Код

class MethodExecutor {
    private Strategy strategy = new DoNothingStrategy();
    
    public void process() {
        strategy.process();
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
}


И, соотвественно, сначала устанавливаете нужную стратегию через сеттер, а затем вызываете метод process сколько угодно раз.

Автор: priam220 2.5.2012, 13:34
Технически это http://java.dzone.com/articles/reloading-java-classes-401 (HotSwap, JRebel). Но это тулзы больше для дебага. 
Как решение, Stolzen, предложил наиболее естественное, имхо. Хотя для вашего случая, возможно достаточно ввести дополнительный булиан:
Код

   if(isNotFound && a.startsWith('something')){
      ...
      isNotFound  = false;  //вместо переопределения стратегии.
   }


Мне кажется такой подход должен быть чуть быстрее, чем вызов метода strategy.process();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)