Написать делегат C# в Java

Как я могу написать код ниже в версии java?

Я читал похожие вопросы, но они сбивают с толку, они ответили, что в java нет функции делегирования, как в C#, с другой стороны, они ответили своей реализацией делегата в java, но с моим условием нет ничего похожего. Я очень надеюсь, что этот вопрос ясен. Я застрял с недели

    class Action
    {
        public delegate void ActionDelegate();
        public static ActionDelegate OnAction;

        public void DoAction()
        {
            Console.WriteLine("Action A");
            if (!ReferenceEquals(OnAction, null))
                OnAction();
        }
    }
    class TaskA
    {
        public TaskA()
        {
            Action.OnAction += DoTaskA;
        }
        private void DoTaskA()
        {
            Console.WriteLine("Do Task A");
        }

    }
    class TaskB
    {
        public TaskB()
        {
            Action.OnAction += DoTaskB;
        }
        private void DoTaskB()
        {
            Console.WriteLine("Do Task B");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            TaskA taskA = new TaskA();
            TaskB task = new TaskB();
            Action action = new Action();
            action.DoAction();
        }
    }

Выход:

Action A
Do Task A
Do Task B
Press any keys to continue...

1 ответ

Что -то подобное в java будет использовать интерфейс

вы можете получить следующие результаты

Action A
Do Task A
Do Task B

с кодами ниже.

import java.util.ArrayList;
public class HelloWorld{

     public static void main(String []args){ 

            TaskA taskA = new TaskA();
            TaskB task = new TaskB();
            Action action = new Action();
            action.doAction();
     }
}

interface ActionDelegate {
    void doAction();
}

class Action{

    static public ArrayList<ActionDelegate> onAction = new ArrayList<>();
    public void doAction(){
        System.out.println("Action A");
        for(ActionDelegate ad: onAction){
            ad.doAction();
        }
    }
}
class TaskA implements ActionDelegate{

    TaskA(){
        Action.onAction.add(this);
    }
    public void doAction(){ 
            System.out.println("Do Task A");
    }

}

class TaskB implements ActionDelegate{

    TaskB(){
        Action.onAction.add(this);
    }
    public void doAction(){ 
            System.out.println("Do Task B");
    }

}

С помощью зеркала безопасности проекта на пути к классам вы получите библиотечную поддержку для делегатов и событий.

<dependency>
    <groupId>com.github.hervian</groupId>
    <artifactId>safety-mirror</artifactId>
    <version>3.0.0</version>
</dependency>

Вот отрывок из README проекта:

Шпаргалка функций

  • Веселье и друзья: Больше никаких функциональных интерфейсов:
    Fun.With0Params<String> myFunctionField = " hello world "::trim;
    Fun.With2Params<Boolean, Object, Object> equals = Objects::equals;

      public void foo(Fun.With1ParamAndVoid<String> printer) throws Exception {
          printer.invoke("hello world);
      }  
      foo(System.out::println);   //This signature match the the Fun defined by method Foo. If it did not, the compiler would emit an error.  
    

    Это все типобезопасно: вы получите ошибки времени компиляции, если подпись ссылки на метод не соответствует тому, что определено подклассом Fun.

      Method m1 = Fun.toMethod(String::isEmpty)
      Method m2 = Fun.<String>toMethod(Class::forName)); // to get overloaded method you must specify parameters in generics  
    
      assertEquals("isEmpty", Fun.getName(String::isEmpty)); //use Fun's static getName method to get the method name. The Method objects returned from toMethod will not return the correct String.
    
  • Делегаты на Java!

      Delegate.With1Param<String, String> greetingsDelegate = new Delegate.With1Param<>();
      greetingsDelegate.add(str -> "Hello " + str);
      greetingsDelegate.add(str -> "Goodbye " + str);
    
      DelegateInvocationResult<String> invocationResult = greetingsDelegate.invokeAndAggregateExceptions("Sir");
    
      invocationResult.getFunctionInvocationResults().forEach(funInvRes -> System.out.println(funInvRes.getResult()));
      //prints: "Hello sir" and "Goodbye Sir"
    
  • События

      //Create a private Delegate. Make sure it is private so only *you* can invoke it.
      private static Delegate.With0Params<String> trimDelegate = new Delegate.With0Params<>();
    
      //Create a public Event using the delegate you just created.
      public static Event.With0Params<String> trimEvent= new Event.With0Params<>(trimDelegate);
    
  • Создание безопасного метода

      Method m1 = Fun.toMethod(Thread::isAlive)  // Get final method
      Method m2 = Fun.toMethod(String::isEmpty); // Get method from final class
      Method m3 = Fun.toMethod(BufferedReader::readLine); // Get method that throws checked exception
      Method m4 = Fun.<String, Class[]>toMethod(getClass()::getDeclaredMethod); //to get vararg method you must specify parameters in generics
      Method m5 = Fun.<String>toMethod(Class::forName); // to get overloaded method you must specify parameters in generics
      Method m6 = Fun.toMethod(this::toString); //Works with inherited methods
    

Отказ от ответственности: я являюсь автором проекта.

Другие вопросы по тегам