質問

クライアントまで、フルの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のではないジェネリック).

役に立ちましたか?

解決

前のJava8:

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

Java8以上

Java8 ラムダを追加し表現されたものの翻訳であります。

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

他のヒント

ない、まさにこのようなが、Javaは似た何かをしています。

これは、匿名内部クラスと呼ばれています。

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

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

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

あなたの例では、匿名内部クラスを使用して、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(); } } });
  

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

質問が処理固有の回答について尋ねられたので、

、直接対応はありません。しかし、処理は、Java 1.4言語レベルを使用して、およびJava 1.1は、大まかな近似している匿名内部クラスを導入します。

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

あなたは、すべての最初にすべてのC#のデリゲートことを、ここで忘れていた - のスレッドセーフのです。 これらの例は、1つだけのスレッドアプリケーションのためのものです..

現代アプリのほとんどは、マルチスレッドの概念に書かれています。.. だから、誰も答えは答えではありません。

Javaで同等のがありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top