3 ms·
Not sure I agree with the GP's point, but I believe he's arguing that when fulfilling the contract of a fictional MouseClickListener: interface MouseClickLis
by hythloday 15y ago
Not sure I agree with the GP's point, but I believe he's arguing that when fulfilling the contract of a fictional MouseClickListener:
interface MouseClickListener {
void mouseClicked(MouseEvent e);
}
one often uses an anonymous class to do so:
void init() {
mouse.setClickListener(new MouseClickListener() {
void mouseClicked(MouseEvent e) {
println(e);
}
});
}
the exact effect could be achieved with a reference to a named function (if Java supported them, which presumably it will once "everything is an object"):
void init() {
void mouseClick(MouseEvent e) { println(e); }
mouse.setClickListener(mouseClick);
}
given that interfaces are simply syntax for function routing, when you have the ability to reference functions by first-class types (i.e. you have the ability to determine function routing yourself), the set of things that you can only sensibly do with interfaces is a lot smaller.
This is how C# delegates work, right? Any Java -> C# programmer want to comment on whether they rely less on interfaces now and what they use them for?
- eropple 15y agoI bounce between Java and C#. I'm not sure at all what he's talking about. I use interfaces all the time in C#. I even specify delegate properties (as distinct from events, when I don't want them to be multicast) in interfaces. I think both concepts are probably independent of one another.
- bermanoid 15y agoFirst class functions pretty much have no bearing on whether or not interfaces are useful. Sure, one use case for inner classes is to implement interfaces in-place in situations where what you really want to do is just pass a function, and in those cases it's probably better to use a function instead, but the equivalence doesn't go the other way. There are plenty of cases where you really need to pass an object to a function and know that the object supports multiple operations, for instance take a look at Map<K,V>: http://docs.oracle.com/javase/6/docs/api/java/util/Map.html http://docs.oracle.com/javase/6/docs/api/java/util/Map.html There are 14 methods there, and when I write code that takes a Map object, I really mean it - I'm not just using the interface as a hack because I want a function pointer, I need an object that supports all of those methods, and I'm probably going to be using several of them.