The complication there is that every time you have an Object argument/field you 
would have to have an if instanceof ConsString cast String sequence, which is a 
huge performance hit.  ConsString was introduced to significantly improve 
performance (high frequency operation), so it's a bit of a dilemma.  The team 
has debated this several times.  It might be better in the long run to be able 
to properly declare the HashMap with something like;

        var StringHashMap = Java.type("java.util.HashMap<java.lang.String, 
java.lang.Object>");

or even better

        var JObject = Java.type("java.lang.Object");
        var JString = Java.type("java.lang.String");
        var StringHashMap = Java.type("java.util.HashMap", JString, JObject);

Just my 2 cents.

Cheers,

-- Jim



On 2013-10-13, at 11:33 AM, Tal Liron <[email protected]> wrote:

> 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?
> 
> 

Reply via email to