LINUX.ORG.RU

[Java] аналоги boost::function и boost::bind

 


0

0

На С++ я бы написал вот так:

class Worker
{
public:
  void work1() { } 
  void work2(int i) {}
};

template<typename T>
class WorkWrapper
{
private:
  T handler;
public:
  WorkWrapper(T h):handler(h) {}
  void start()
  {
    //  preExecute()
    handler();
    // postExecute()
  }
  
};

//...

  Worker worker;
  WorkWrapper<boost::function<void()> >wrapper1(boost::bind(&Worker::work2,&worker,1));
  wrapper1.start();
  WorkWrapper<boost::function<void()> >wrapper2(boost::bind(&Worker::work1,&worker));
  wrapper2.start();

А как подобное поведение можно реализовать на Java ?

★★
interface Handler {
    void handle();
}

class Worker {
    public void work1() { }
    public void work2(int i) { }
}

class WorkWrapper {
    private Handler handler;

    public WorkWrapper(Handler handler) {
        this.handler = handler;
    }

    public void start() {
        // preExecute();
        handler.handle();
        // postExecute();
    }
}

// ...
final Worker worker = new Worker();
WorkWrapper wrapper1 = new WorkWrapper(new Handler() {
    public void handle() {
        worker.work2(1);
    }
});
wrapper1.start();
WorkWrapper wrapper2 = new WorkWrapper(new Handler() {
    public void handle() {
        worker.work1();
    }
});
wrapper2.start();

Вкратце - статический полиморфизм я заменил динамическим.

preExecute() и postExecute() меня наводят на мысль о том, что ВОЗМОЖНО стоит посмотреть в сторону аспектно-ориентированного программирования.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Спасибо. Похоже это именно то что надо.

Vinick ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.