2009-08-27 15 views
25

In C# è possibile definire i delegati in modo anonimo (anche se non sono altro che zucchero sintattico). Ad esempio, posso farlo:Equivalente dei metodi anonimi C# in Java?

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

È possibile passare il codice come questo in Java? Sto usando il framework di elaborazione, che ha una versione piuttosto vecchia di Java (non ha generici).

+0

[A q sui delegati, in generale, in Java] (http://stackoverflow.com/questions/44912/java-delegates) – nawfal

risposta

50

Pre Java 8:

Il più vicino ai delegati Java sono le interfacce a metodo singolo. Potresti usare una classe interiore anonima.

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 e superiori:

Java 8 aggiunge espressioni lambda alla lingua.

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

[Google Collezioni] [1] e Groovy [2] potrebbe interessarti. [1] http://code.google.com/p/google-collections/ [2] http://groovy.codehaus.org/ –

11

Non esattamente come questo, ma Java ha qualcosa di simile.

Si chiama classi interne anonime.

Lasciate che vi faccia un esempio:

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

E 'un po' più prolisso e richiede un'interfaccia da implementare, ma a parte questo è più o meno la stessa cosa

2

E 'possibile passare codice come questo in Java? Sto usando il framework di elaborazione , che ha una versione piuttosto vecchia di Java (non ha i generici ).

Poiché la domanda posta sulla risposta specifica di elaborazione, non esiste un equivalente diretto. Ma Processing utilizza il livello di linguaggio Java 1.4 e Java 1.1 introduce classi interne anonime, che sono approssimative.

3

Il vostro esempio sarà simile a questa in Java, usando anomymous classi interne:

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

Ad esempio:

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); 
    } 
} 

uscita:

Bla Bla: 123

Foo Bar: 123

0

Hai dimenticato che un delegato C# prima di tutto è thread safe. Questi esempi sono solo per un singolo thread App.

La maggior parte delle app contemporanee sono scritte su un concetto multithreaded .. Quindi nessuna risposta è la risposta.

Non c'è un equivalente in Java

+0

Non è che quello che stai dicendo è sbagliato. È corretto. Il problema è che questo in realtà non risponde alla domanda che viene posta --- dice solo che tutte le altre risposte sono sbagliate. Stai dicendo che non c'è * non * un equivalente in Java? –

+0

sì, sto dicendo quello che sto dicendo .. –