TLDR:
Is there a Java equivalent of C#'s delegates that will allow me to queue up methods of various classes and add them to the queue dynamically? Language constructs instead of the code for it.
Context:
I have used Unity 3D before and I love things like the Update
method of scripts. Just declaring the method adds it to the list of methods executed each frame. I want to create something like that in my LWJGL game. For this, I would want to use delegates (or something equivalent to it). Is there any Java language construct that would allow me to do this? I would prefer answers that include two or more (so that I can pick and choose which will be the most optimal for my code) constructs and a way of using them. I don't want the code, I just want to know where to start. The most fun part of programming is working the problem out and I don't want to be deprived of that. Also, I don't want to be told EXACTLY how to do it. I want to be guided in the right direction instead of being thrown in that direction onto that destination. How would I learn? :-)
Actually there is no exact counterpart for delegates in Java. But there are constructs that mimic their behavior.
The concept that comes closes to delegates in Java 8 is that of functional interfaces.
For example, if you have a C# delegate:
delegate void Runnable();
in Java, you would create a functional interface like:
@FunctionalInterface
public interface Runnable {
void run();
}
The nice thing about functional interfaces is they can be used easily in lambda expressions.
So, let's suppose you have the following class:
public class SomeClass {
public static void someStaticMethod() {
}
public void someMethod() {
}
}
With Java 8, you get lambda expressions.
List<Runnable> queue = new ArrayList<>();
queue.add(() -> someMethod());
queue.add(() -> someStaticMethod());
There is a short-hand named method reference for this, if you actually simply call a method:
List<Runnable> queue = new ArrayList<>();
queue.add(this::someMethod);
queue.add(SomeClass::someStaticMethod);
With Java 7, the only thing you can use is anonymous classes:
List<Runnable> queue = new ArrayList<>();
queue.add(new Runnable() {
public void run() {
someMethod();
}
});
queue.add(new Runnable() {
public void run() {
someStaticMethod();
}
});
I hope this was not too much information, so you can still learn. ;-) However, I like my answer to be useful also for other people looking up this question.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With