TLDR:
是否有一个Java等价的C#delegates,它允许我排队各种类的方法并动态地将它们添加到队列中?语言构造而不是代码。
上下文:
之前我使用过Unity 3D,我喜欢像Update
脚本方法这样的东西。只是声明该方法将其添加到每帧执行的方法列表中。我想在我的LWJGL游戏中创建类似的东西。为此,我想使用委托(或类似的东西)。是否有任何Java语言结构允许我这样做?我更喜欢包含两个或更多的答案(以便我可以选择哪个是我的代码最优化的)构造和使用它们的方法。我不想要代码,我只想知道从哪里开始。编程中最有趣的部分是解决问题,我不想被剥夺。此外,我不想被告知如何做到这一点。我希望被引导朝着正确的方向,而不是朝着那个方向被抛到那个目的地。我该怎么学? : - )
答案 0 :(得分:16)
实际上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();
}
});
我希望这不是太多的信息,所以你仍然可以学习。 ;-) 但是,我喜欢我的回答,对于查找这个问题的其他人也很有用。
答案 1 :(得分:6)
摘自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确实有一些函数指针。
正如您礼貌地要求的那样,我不打算告诉您具体如何实现此代码,但您应该能够提供有关此信息的解决方案。
答案 2 :(得分:0)
java函数接口!= c#委托。从消费者的角度来看,除了纯c风格的函数指针之外,您将无法获得任何详细信息。您无法确定Java函数接口是将某些对象绑定为lambda表达式还是成员函数,还是仅具有零依赖关系的静态方法。我想说c#委托提供了一些非常有趣的功能,可能并不那么重要,可以帮助诊断潜在的程序缺陷,例如委托的线程安全。