Hacker News new | past | comments | ask | show | jobs | submit login

> Java introduced closures in 2014

Java has had closures since 1997 hasn’t it? Don’t anonymous classes close over local state? Just the syntax was verbose.

Do you mean the lambda syntax? Well that isn’t thue only thing in Java that forms a closure.

‘Closure’ and ‘anonymous function syntax’ are orthogonal.




Java anon classes couldn't capture non-final locals back when they were introduced. So they were closures, but not full-fledged. In contrast, C# anon delegates could capture any local, including writeable ones.


They still can't, captured variables need to be "effectively final" since Java 8, meaning they aren't allowed to be written after the capture.

I think that's reasonable though, capturing mutable state is a recipe for disaster, and if you really want/need to you can wrap it in a properly synchronized container (e.g. AtomicReference in Java)


In most cases, lambdas that capture mutable state effectively take ownership of it, so there's no issue there.


Anonymous inner classes are not proper closures as the other comment explained. And as you noted the syntax is so abhorrent that their use is actively discouraged by the guava developers for example. And all the source code pre-Java 8 that use anonymous inner classes to pass functions around was pretty unreadable.


Why do you think they aren’t proper closures? Because they don’t allow you to mutate captured locals? Neither do closures in Haskell, and neither do lambdas in Java 8, so by that argument Java still doesn’t have closures. Your arguments are inconsistent because you’ve claimed that Java now has closures, even though they still do not meet your definition of closures.

Apart from effective finality and implementation, the semantics of anonymous classes and lambdas is the same!




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: