2016-04-20 7 views
0

ich möchte meinen Code faktorisieren, weil ich wirklich einen großen gleichen Block des Codes in zwei Klassen habe. Aber sie sind in anonymen runnable Klasse, hier so eine Beschreibung meiner SituationJAVA: factorise code -> runnable anonyme Klasse

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(){} 
} 

und wie Sie sich vorstellen können Ich möchte so etwas wie das

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(){} 
} 

vielleicht mit einem Argument in der super() Rufen Sie an, aber es gibt keine Funktion Pointer in Java, und ich möchte keine Reflektion durchführen, wenn es möglich ist.

Vielen Dank für Ihre Hilfe

Antwort

0

Was ist so etwas wie dieses:

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

Perfect, das eine gute Lösung ist, danke –

Verwandte Themen