TLDR:
是否有Java等效于C#的delegates,可以让我排队各种类的方法并将其动态添加到队列中?语言构造而非代码。
上下文:
我以前使用过Unity 3D,而且我喜欢脚本的Update
方法之类的东西。只需声明该方法即可将其添加到每帧执行的方法列表中。我想在我的LWJGL游戏中创建类似的内容。为此,我想使用委托(或与其等效的东西)。是否有任何Java语言构造可以允许我执行此操作?我希望答案包括两个或多个(以便我可以选择最适合我的代码的)构造和使用它们的方式。我不需要代码,我只想知道从哪里开始。编程中最有趣的部分是解决问题,我也不想被剥夺。另外,我也不想被告知确切的操作方法。我想被引导向正确的方向,而不是被引导向那个目的地。我将如何学习? :-)
摘自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,我们确实具有某种功能指针。
您有礼貌地要求,我不会确切地告诉您如何实现此代码,但是您应该能够根据此信息提出解决方案。
实际上,Java中没有与委托完全相同的副本。但是有一些模仿它们行为的构造。
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() {
}
}
使用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,唯一可以使用的是anonymous classes:
List<Runnable> queue = new ArrayList<>();
queue.add(new Runnable() {
public void run() {
someMethod();
}
});
queue.add(new Runnable() {
public void run() {
someStaticMethod();
}
});
我希望这不是太多信息,所以您仍然可以学习。 ;-)但是,我希望我的回答对查找此问题的其他人也很有用。
java函数接口!= c#委托。从消费者的角度来看,除了纯c风格的函数指针之外,您将无法获得任何详细信息。您无法确定Java函数接口是将某些对象绑定为lambda表达式还是成员函数,还是仅具有零依赖关系的静态方法。我想说c#委托提供了一些非常有趣的功能,可能并不那么重要,可以帮助诊断潜在的程序缺陷,例如委托的线程安全。