Делегаты Java?

В зависимости от того, что java-se именно вы имеете в виду, вы j2se можете добиться аналогичного java-api эффекта (передавая метод), используя java-libraries шаблон стратегии.

Вместо такой oraclejdk строки, объявляющей сигнатуру openjdk именованного метода:

// C#
public delegate void SomeFunction();

объявить java-se интерфейс:

// Java
public interface ISomeBehaviour {
   void SomeFunction();
}

Для конкретных func-delegate реализаций метода определите javax класс, реализующий поведение:

// Java
public class TypeABehaviour implements ISomeBehaviour {
   public void SomeFunction() {
      // TypeA behaviour
   }
}

public class TypeBBehaviour implements ISomeBehaviour {
   public void SomeFunction() {
      // TypeB behaviour
   }
}

Затем java-libraries везде, где у вас был бы делегат delegate SomeFunction в C#, используйте вместо jdk него ссылку ISomeBehaviour:

// C#
SomeFunction doSomething = SomeMethod;
doSomething();
doSomething = SomeOtherMethod;
doSomething();

// Java
ISomeBehaviour someBehaviour = new TypeABehaviour();
someBehaviour.SomeFunction();
someBehaviour = new TypeBBehaviour();
someBehaviour.SomeFunction();

С анонимными openjdk внутренними классами вы даже core-java можете избежать объявления j2se отдельных именованных классов .java и рассматривать их почти java-libraries как настоящие функции-делегаты.

// Java
public void SomeMethod(ISomeBehaviour pSomeBehaviour) {
   ...
}

...

SomeMethod(new ISomeBehaviour() { 
   @Override
   public void SomeFunction() {
      // your implementation
   }
});

Это, вероятно, следует java-se использовать только в том delegates случае, если реализация очень java-se специфична для текущего контекста .java и не получит преимуществ java-se от повторного использования.

И, конечно java-api же, в Java 8 они становятся jre в основном лямбда-выражениями:

// Java 8
SomeMethod(() -> { /* your implementation */ });

java

delegates

2022-11-09T14:43:40+00:00