2013-09-03 19 views
15

Czy istnieje sposób przekazywania bloku wykonywalnego jako parametru metody statycznej? Czy to w ogóle możliwe? Na przykład mam tę metodęJak przekazać blok wykonywalny jako parametr w Javie?

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

lub coś podobnego. To jest bardziej skomplikowane, po prostu uprościłem pytanie. Próbuję refaktoryzować mój projekt i stworzyłem generyczną klasę narzędziową, która zawiera statyczne metody używane przez moje klasy.

+2

Sprawdź wzór polecenia. –

+0

Myślę, że następna wersja Java ma coś takiego, ale w tej chwili nie ma dla niej obsługi języka, musisz zawrzeć swoją logikę w klasie, jak na przykład obsługa zdarzeń w aplikacjach Swing i inne. – zneak

+7

Użyj opcji Runnable lub Future lub wybranego interfejsu. –

Odpowiedz

24

Można użyć Runnable obiekty:

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

Następnie można wywołać go z:

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

EDIT (przepraszam, @Bohemian): w Java 8, kod wywołujący można uprościć stosując lambdas:

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

Wy nadal deklarują someMethod taki sam droga. Składnia lambda tylko upraszcza tworzenie i przekazywanie Runnable s.

+6

+1 pojedynczy post (nie rozwijający się), poprawna odpowiedź :) – Bohemian

+0

To jest właśnie to, czego potrzebowałem. – Keale

+0

@Bohemian - Heh. Miałem też wiele innych rodzajów. :) –

-1

Możesz po prostu utworzyć interfejs i przekazać obiekty z klas implementujących ten interfejs. Jest to znane jako wzorzec poleceń.

Na przykład można mieć:

public interface IBlock 
{ 
    void execute(); 
} 

i klasę wykonawczego:

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

W Javie 8 będzie można przekazać wyrażeń lambda, takich jak predykatów i funkcji, które uczynią kodu trochę czystsze, ale w zasadzie zrobić to samo.

+1

to nie jest "wzorzec polecenia" – nachokk

+5

Meh ...nie trzeba tworzyć nowych interfejsów, aby to zrobić. Użyj 'Runnable'. –

+0

używać uruchamianych dźwięków naprawdę nie jest czysty, tylko mój punkt widzenia, nigdy nie widziałem kodu przy użyciu taktowanego w ten sposób – Seb

Powiązane problemy