2009-08-27 13 views
25

W języku C# można definiować delegatów anonimowo (mimo że są one niczym więcej niż syntaktycznym cukrem). Na przykład mogę to zrobić:Odpowiednik metod anonimowych C# w Javie?

public string DoSomething(Func<string, string> someDelegate) 
{ 
    // Do something involving someDelegate(string s) 
} 

DoSomething(delegate(string s){ return s += "asd"; }); 
DoSomething(delegate(string s){ return s.Reverse(); }); 

Czy można przekazać kod w Javie? Używam struktury przetwarzania, która ma dość starą wersję Java (nie ma generycznych).

+0

[Q na uczestników ogólnie Jawa] (http://stackoverflow.com/questions/44912/java-delegates) – nawfal

Odpowiedz

50

Pre Java 8:

Najbliższa Java ma do delegatów są interfejsy pojedynczej metody. Możesz użyć anonimowej klasy wewnętrznej.

interface StringFunc { 
    String func(String s); 
} 

void doSomething(StringFunc funk) { 
    System.out.println(funk.func("whatever")); 
} 

doSomething(new StringFunc() { 
     public String func(String s) { 
      return s + "asd"; 
     } 
    }); 


doSomething(new StringFunc() { 
     public String func(String s) { 
      return new StringBuffer(s).reverse().toString(); 
     } 
    }); 

Java 8 i powyżej:

Java 8 dodaje wyrażeń lambda do języka.

doSomething((t) -> t + "asd"); 
    doSomething((t) -> new StringBuilder(t).reverse().toString()); 
+2

[Kolekcji GOOGLE] [1] Groovy [2] może Cię zainteresować. [1] http://code.google.com/p/google-collections/ [2] http://groovy.codehaus.org/ –

11

Nie do końca tak, ale Java ma coś podobnego.

To się nazywa anonimowe klasy wewnętrzne.

Podam przykład:

DoSomething(new Runnable() { 
    public void run() { 
     // "delegate" body 
    } 
}); 

To trochę bardziej gadatliwy i wymaga interfejsu do wdrożenia, ale poza tym to całkiem dużo samo

2

Czy to możliwe, aby przekazać kod jak ten w Javie? Używam struktury przetwarzania , która ma dość starą wersję Java (nie ma wersji ).

Od czasu pytania o odpowiedź specyficzną dla przetwarzania nie ma bezpośredniego odpowiednika. Ale Processing używa języka Java w wersji 1.4, a Java 1.1 wprowadziła anonimowe klasy wewnętrzne, które są przybliżonym przybliżeniem.

3

Twój Przykładem może wyglądać w Javie, używając anomymous klasy wewnętrzna:

interface Func { 
    String execute(String s); 
} 

public String doSomething(Func someDelegate) { 
    // Do something involving someDelegate.execute(String s) 
} 

doSomething(new Func() { public String execute(String s) { return s + "asd"; } }); 
doSomething(new Func() { public String execute(String s) { return new StringBuilder(s).reverse().toString(); } } }); 
2

Na przykład:

public class Delegate 
{ 
    interface Func 
    { 
     void execute(String s); 
    } 

    public static void doSomething(Func someDelegate) { 
     someDelegate.execute("123"); 
    } 

    public static void main(String [] args) 
    { 

     Func someFuncImplementation = new Func() 
     { 
      @Override 
      public void execute(String s) { 
       System.out.println("Bla Bla :" + s); 
      } 
     }; 

     Func someOtherFuncImplementation = new Func() 
     { 
      @Override 
      public void execute(String s) { 
       System.out.println("Foo Bar:" + s); 
      } 
     }; 


     doSomething(someFuncImplementation); 
     doSomething(someOtherFuncImplementation); 
    } 
} 

wyjściowa:

Bla Bla: 123

Foo Bar: 123

0

Wszyscy zapomnieliście tutaj, że delegat C# przede wszystkim - jest bezpieczny dla wątków. Te przykłady dotyczą tylko pojedynczego wątku App ..

Większość współczesnych aplikacji napisanych jest w oparciu o koncepcję wielowątkową .. Więc nikt nie odpowiada.

Nie jest równoważne Java

+0

Nie to, co mówisz, jest złe. Jest prawidłowe. Problem polega na tym, że nie odpowiada to na zadawane pytanie - po prostu mówi, że wszystkie pozostałe odpowiedzi są błędne. Czy mówisz, że w Javie jest * nie * odpowiednik? –

+0

tak, mówię, co mówię ... –