Написать делегат 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
Отказ от ответственности: я являюсь автором проекта.