Java等效于C#委托(要执行的各种类的队列方法)

问题描述 投票:8回答:3

TLDR:

是否有Java等效于C#的delegates,可以让我排队各种类的方法并将其动态添加到队列中?语言构造而非代码。

上下文:

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

java c# delegates
3个回答
8
投票

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

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

就是说,Java没有像C#这样的委托。 但是,从Java 8开始,通过使用method references and functional interfaces,我们确实具有某种功能指针。

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


19
投票

实际上,Java中没有与委托完全相同的副本。但是有一些模仿它们行为的构造。

Java 8

功能接口

Java 8中接近于委托的概念是功能接口的概念。

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

delegate void Runnable();

在Java中,您将创建一个类似以下的功能接口:

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

关于功能接口的优点是可以在lambda expressions中轻松使用它们。

示例

所以,假设您有以下课程:

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);

Java 7

对于Java 7,唯一可以使用的是anonymous classes

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.