2009-08-27 6 views
25

C#では、代理人を匿名で定義することができます(ただし、構文的な砂糖以上のものではありません)。たとえば、私はこれを行うことができます:JavaのC#匿名メソッドに相当しますか?

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

Javaでこのようなコードを渡すことは可能ですか?私はかなり古いバージョンのJavaを持っている処理フレームワークを使用しています(ジェネリックはありません)。

+0

[Javaで一般にデリゲートにQ](http://stackoverflow.com/questions/44912/java-delegates) – nawfal

答えて

50

前のJava 8だという以外に:

Javaに最も近いのは、単一のメソッドインタフェースです。匿名の内部クラスを使用できます。

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以上:

Java 8言語にラムダ式を追加します。

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

[Googleのコレクション] [1]及びGroovy [2]はあなたにとって興味深いかもしれません。 [1] http://code.google.com/p/google-collections/ [2] http://groovy.codehaus.org/ –

11

これとまったく同じではありませんが、Javaには似たようなものがあります。

匿名の内部クラスと呼ばれます。

は私はあなたに例を挙げましょう:

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

それはもう少し冗長だと実装するためのインタフェースを必要とし、 が、それはほとんど同じこと

2

それはJavaでこの ようなコードを渡すことは可能ですか?私は非常に古い バージョンのJava(それは ジェネリックスを持っていません)を持っている フレームワークの処理を使用しています。

処理固有の回答について質問したので、直接の同等のものはありません。しかしProcessingはJava 1.4言語レベルを使用し、Java 1.1は匿名内部クラスを導入しました。これはおおよその近似です。

3

あなたの例では、anomymous内部クラス使用して、Javaで次のようになります。たとえば

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

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

出力:

BLAのBLA:123

フーバー:123

0

まず、C#の代理人がスレッドセーフであることを忘れてしまいました。 これらの例は単なるスレッドアプリケーション用です。

ほとんどの最新のAppsはマルチスレッドのコンセプトで書かれています。 答えは誰も答えはありません。 Javaで当量がありません

+0

あなたの言っていることは間違っているわけではありません。あたりです。問題は、これは実際に質問されている質問に答えるものではなく、他のすべての回答が間違っているということだけです。あなたは、* Java *に相当するものがないと言っていますか? –

+0

はい、私が言っていることを言っています.. –

関連する問題