A ConsString Gotcha
Tal Liron
tal.liron at threecrickets.com
Sun Oct 13 07:33:26 PDT 2013
ConsString can cause some hard-to-find bugs when interacting with Java
classes.
Consider this code:
var map = new java.util.HashMap
var prefix = 'a'
var key = prefix + 'b'
map.put(key, 'hello')
print(map.get(key) + '\n')
print(map.get('ab') + '\n')
It will output 'hello' and then 'null'. The reason is that key is a
ConsString. See for yourself:
for (var i = map.keySet().iterator(); i.hasNext(); ) {
print(i.next().getClass() + '\n')
}
This can cause some very hard-to-find bugs. I know too well. :). I'm not
sure how best to deal with it, but here are some suggestions.
1. Document it in the user guide, possibly with the simple example I
gave above. I expect that many of these bugs will happen when dealing
with generic classes, such as those in java.util. The workaround for the
example above:
var key = String(prefix + 'b')
But that's hardly intuitively necessary.
2. It may be a good idea for Nashorn to always coerce ConsString into
String when interacting with Java, even if the method signature expects
an Object.
The one downside I can think of is that it will make it impossible to
offer special handling for ConsString in Java classes. This would seem,
however, to be quite a rare usage and may not be worth the potential for
awful bugs.
What do you think?
More information about the nashorn-dev
mailing list