문제

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가있는 처리 프레임 워크를 사용하고 있습니다 (제네릭이 없습니다).

도움이 되었습니까?

해결책

사전 자바 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());

다른 팁

똑같지는 않지만 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# 델리 게이트가 우선 - 스레드 안전합니다. 이 예제는 단일 스레드 앱을위한 것입니다 ..

대부분의 현대 앱은 멀티 스레드 개념으로 작성되었습니다. 따라서 아무도 대답이 아닙니다.

Java에는 동등한 것이 없습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top