private val lockByKey = new java.util.concurrent.ConcurrentHashMap[Any, Object] ... locks.get(key)This is what I actually typed:
private def lockByKey = new java.util.concurrent.ConcurrentHashMap[Any, Object] ... locks.get(key)Because I put 'def lockByKey' instead of 'val lockByKey' I created myself a function that creates a new ConcurrentHashMap every time it gets called instead of a single instance. Scala allows leaving out brackets in many cases so code like lockByKey.get(...) compiled fine, but as every access was creating a new map things didn't work entirely correctly.
Thankfully unit tests of basic functionality (eg ability to get the same value back twice) caught that something was awry and I was able to identfy that I had cleverly created a factory function rather than a static instance. Thank god for unit tests ;)
3 comments:
I think that's a feature of scala, having the namespace and syntax of defs and vals the same, so you can start with a val, and without changing any of the client code, transform it into a function that calculates what you need. Or maybe, like your case, start with a def and decide it can be optimized by calculating it only once, turning it into a val.
That a nullary method def and a val have the same usage syntax comes from the Uniform Access Principle. It's very useful as it allows encapsulation of whether a property is stored or derived at runtime.
"Interesting read! This article sheds light on the subtle pitfalls developers can fall into when using Scala. I appreciate how you highlight the importance of understanding the language's features and avoiding common misconceptions. It’s a great reminder that even experienced programmers can sometimes misinterpret the nuances of a language. I’d love to see more examples of these traps in action and strategies for overcoming them. Thanks for sharing your insights!"
Digital Marketing Course In Hyderabad
Post a Comment