2016-04-20 1 views
0

Je voudrais factoriser mon code car j'ai vraiment un énorme bloc de code en deux classes. Mais ils sont en classe runnable anonyme, alors voici une description de ma situationJAVA: factoriser le code -> runnable anonyme class

class A { 
    A(){} 
    do_A_function(){} 
} 
class B extends A{ 
    B(){ 
     Runnable runB=new Runnable() { 
      public void run() { 
       while (true) { 
        super.do_A_function(); 
        do_B_function();      
       } 
      } 
     }; 
     new Thread(runB).start(); 
    } 

    do_B_function(){} 
} 
class C extends A{ 

    C(){ 
     Runnable runC=new Runnable() { 
      public void run() { 
       while (true) { 
        super.do_A_function(); 
        do_C_function();      
       } 
      } 
     }; 
     new Thread(runC).start(); 
    } 

    do_C_function(){} 
} 

et comme vous pouvez le deviner je voudrais quelque chose comme ça

class A { 
    A(){ 
     Runnable runC=new Runnable() { 
      public void run() { 
       while (true) { 
        do_A_function(); 
        do_C_function() OR do_B_function(); 
       } 
      } 
     }; 
     new Thread(runA).start(); 

    } 
    do_A_function(){} 
} 

class B extends A{ 
    B(){ 
     super(); 
    } 
    do_B_function(){} 
} 

class C extends A{ 
    C(){ 
     super(); 
    } 
    do_C_function(){} 
} 

peut-être avec un argument dans le super() appel, mais il n'y a pas de pointeurs de fonction en Java, et je ne veux pas faire de réflexion si c'est possible.

je vous remercie beaucoup pour votre aide

Répondre

0

Qu'en est-il quelque chose comme ceci:

public class MyRunnable implements Runnable { 
    private final Listener listener; 

    public MyRunnable(Listener listener) { 
     this.listener = listener; 
    } 

    public void run() { 
     while (true) { 
      doA(); 
      listener.callback() 
     } 
    } 
} 

public interface Listener { 
    void callback(); 
} 

class B implements Listener { 
    B() { 
     new Thread(new MyRunnable(this)).start(); 
    } 

    @Override 
    public void callback() { 
     do_B_function(); 
    } 

    public void do_B_function(){} 
} 
+0

parfait, c'est une bonne solution, je vous remercie –