繁体   English   中英

Java 等效于 C# Delegates(将要执行的各种类的方法排队)

[英]Java equivalent of C# Delegates (queues methods of various classes to be executed)

域名注册地址:

是否有 Java 等价于 C# 的委托,它允许我将各种类的方法排队并将它们动态添加到队列中? 语言构造而不是它的代码。

背景:

我以前使用过 Unity 3D,我喜欢脚本的Update方法之类的东西。 只需声明该方法即可将其添加到每帧执行的方法列表中。 我想在我的 LWJGL 游戏中创建类似的东西。 为此,我想使用委托(或类似的东西)。 是否有任何 Java 语言结构可以让我这样做? 我更喜欢包含两个或更多(以便我可以挑选最适合我的代码的)结构和使用它们的方法的答案。 我不想要代码,我只想知道从哪里开始。 编程中最有趣的部分是解决问题,我不想被剥夺。 此外,我不想被确切地告知如何去做。 我想被引导到正确的方向,而不是被朝那个方向扔到那个目的地。 我将如何学习? :-)

实际上,Java 中的委托没有确切的对应物。 但是有一些结构可以模仿它们的行为。

爪哇 8

功能接口

与 Java 8 中的委托相近的概念是函数式接口的概念

例如,如果您有一个 C# 委托:

delegate void Runnable();

在 Java 中,您将创建一个功能接口,如:

@FunctionalInterface
public interface Runnable {
    void run();
}

函数式接口的好处是它们可以很容易地在lambda 表达式中使用

示例

因此,让我们假设您有以下课程:

public class SomeClass {
    public static void someStaticMethod() {
    }

    public void someMethod() {
    }
}

Lambda 表达式和方法引用

使用 Java 8,您可以获得 lambda 表达式。

List<Runnable> queue = new ArrayList<>();
queue.add(() -> someMethod());
queue.add(() -> someStaticMethod());

如果您实际上只是调用一个方法,则有一个简短的命名方法引用

List<Runnable> queue = new ArrayList<>();
queue.add(this::someMethod);
queue.add(SomeClass::someStaticMethod);

爪哇 7

在 Java 7 中,您唯一可以使用的是匿名类

List<Runnable> queue = new ArrayList<>();
queue.add(new Runnable() {
    public void run() {
        someMethod();
    }
});
queue.add(new Runnable() {
    public void run() {
        someStaticMethod();
    }
});

我希望这不是太多的信息,所以你仍然可以学习。 ;-) 但是,我喜欢我的回答对查找此问题的其他人也有用。

摘自https://msdn.microsoft.com/en-gb/library/aa288459(v=vs.71).aspx

C# 中的委托类似于 C 或 C++ 中的函数指针。 使用委托允许程序员在委托对象中封装对方法的引用。 然后可以将委托对象传递给可以调用引用方法的代码,而不必在编译时知道将调用哪个方法。 与 C 或 C++ 中的函数指针不同,委托是面向对象的、类型安全的和安全的。

也就是说,Java 没有像 C# 那样的委托。 但是,从 Java 8 开始,我们确实通过使用方法引用和函数接口来获得某种函数指针。

正如您礼貌地要求的那样,我不会确切地告诉您如何实现此代码,但是您应该能够根据这些信息提出解决方案。

java 函数接口 != c# 委托。 从消费者的角度来看,除了纯 c 风格的函数指针之外,您将无法获得任何详细信息。 您无法判断 java 函数接口是否将某些对象绑定为 lambda 表达式或成员函数,或者只是具有零依赖关系的静态方法。 我想说 c# 委托提供了一些非常有趣的功能,可能不是那么重要,以帮助诊断潜在的程序缺陷,例如委托的线程安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM