Javari's Reference Immutability

Hasan Aljudy hasan.aljudy at gmail.com
Tue Jul 25 18:10:51 PDT 2006



Regan Heath wrote:
> But java has immutable strings, right?
> http://www.janeg.ca/scjp/pkglang/immutable.html
> 
> That in itself is a form of 'const' covering the most common use cases.

I know.
I was commenting on const objects, not arrays. What's the point of Javari?

 > Of course, because the string is immutable if you modify it, you
 > actually  modify a duplicate string. Are they reference counted then? or
 > does it dup  on every single modification? If so, this would be a very
 > inefficient  implementation of COW.

No, in Java, you can't modify a string. It's a read only reference <g>.
You can modify a StringBuffer in place. However, with String, you can 
only change what the reference refers to.

String concatenation creates a new string:
# String x = a + b;
Here, (assuming a and b are both, String objects) a new string is 
created. The original a and b are not changed.

I think that's the same with array concatenation in D, no?

> 
> Regan
> 
> On Tue, 25 Jul 2006 18:21:58 -0600, Hasan Aljudy 
> <hasan.aljudy at gmail.com>  wrote:
> 
>> I think the question is: what's the point?
>> Clearly, Java's lack of const didn't prevent it from the having some 
>> of  the best libraries there are.
>>
>> Reiner Pope wrote:
>>
>>> I've read the paper on Javari's reference immutability (thanks to  
>>> Bruno) and it has an interesting idea: a synthesis of dynamic and  
>>> static checking.  This makes it easier to interface const-aware code  
>>> with const-unaware code. It can be demonstrated as follows:
>>>  Date a = new Date(); // a mutable date
>>> readonly Date b = a; // A readonly view of a
>>> Date c = (mutable) b; // The compiler bypass static checking, but  
>>> inserts dynamic checks.
>>> a.modify(); // OK
>>> b.modify(); // Compile-time error
>>> c.modify(); // Runtime error
>>>   How could you implement the runtime checking? A first thought 
>>> would  be to add the following assert to the in contract of every 
>>> mutating  method:
>>>    assert(!isConst);
>>>  But that requires that the /class/ knows the const-ness of the  
>>> reference it is accessed through, which I don't think it does.
>>>  The other alternative seems to be a much easier one: simply modify 
>>> the  vtbl so that all mutating functions point to a single line:
>>>    assert(false, "Trying to modify a class through a readonly view");
>>>  The problem with that is that I suspect the vtable is stored with 
>>> the  class, not the reference, so modifying the vtable will modify it 
>>> for  all other references, even if they aren't readonly.
>>>  Clearly, Javari manages such checking, and it claims to manage it in 
>>> a  Java-compatible (backwards-compatible) way. How is it done in 
>>> Javari,  and how could it be done in D?
>>>   Cheers,
>>>  Reiner
> 
> 



More information about the Digitalmars-d-learn mailing list