2013-09-03 12 views
15

Esiste un modo per passare un blocco eseguibile come parametro a un metodo statico? È possibile a tutti? Ad esempio, ho questo metodoCome si passa un blocco eseguibile come parametro in Java?

public static void someMethod(boolean flag, Block block1, BLock block2) { 
    //some other code 
    if(flag) 
     block1.execute(); 
    else block2.execute(); 
    //some other code 
} 

o qualcosa del genere. In realtà è più complicato di così, ho solo semplificato la domanda. Sto cercando di rifattorizzare il mio progetto e ho creato una classe di utilità generica che contiene metodi statici utilizzati dalle mie classi.

+2

Esaminare il modello di comando. –

+0

Penso che la prossima versione di Java abbia qualcosa del genere, ma al momento non c'è supporto per la lingua, devi avvolgere la tua logica all'interno di una classe, come il modo in cui gestisci gli eventi nelle applicazioni Swing e cose del genere. – zneak

+7

Usa un Runnable o un Future o l'interfaccia di tua scelta. –

risposta

24

È possibile utilizzare Runnable oggetti:

public static void someMethod(boolean flag, Runnable block1, Runnable block2) { 
    //some other code 
    if(flag) 
     block1.run(); 
    else block2.run(); 
    //some other code 
} 

Poi si può chiamare con:

Runnable r1 = new Runnable() { 
    @Override 
    public void run() { 
     . . . 
    } 
}; 
Runnable r2 = . . . 
someMethod(flag, r1, r2); 

EDIT (mi dispiace, @Bohemian): in Java 8, il codice chiamante può essere semplificata utilizzando lambda:

someMethod(flag,() -> { /* block 1 */ },() -> { /* block 2 */ }); 

saresti ancora dichiara someMethod stesso modo. La sintassi lambda semplifica semplicemente la procedura di creazione e inoltro di Runnable s.

+6

+1 post-singolo (non in evoluzione), risposta corretta :) – Bohemian

+0

Questo è proprio quello di cui avevo bisogno. – Keale

+0

@Bohemian - Heh. Ne ho avuto un sacco anche dell'altro genere. :) –

-1

È possibile semplicemente creare un'interfaccia e passare oggetti dalle classi che implementano tale interfaccia. Questo è noto come il modello di comando.

Ad esempio, si potrebbe avere:

public interface IBlock 
{ 
    void execute(); 
} 

ed una classe che implementa:

public class Block implements IBlock 
{ 
    public void execute() 
    { 
     // do something 
    } 
} 

In Java 8 si sarà in grado di passare le espressioni lambda, come predicati e funzioni che renderanno la codice un po 'più pulito ma essenzialmente fare la stessa cosa.

+1

questo non è il 'modello di comando' – nachokk

+5

Meh ...non è necessario inventare nuove interfacce per farlo. Usa 'Runnable'. –

+0

usare suoni runnable davvero non puliti, solo il mio punto di vista, mai visto il codice che usa eseguibile in quel modo – Seb

Problemi correlati