Indexing access for Lists and Maps considered harmful?

Joshua Bloch jjb at google.com
Wed Jun 24 10:22:41 PDT 2009


P.S.  I typed this in a hurry.  What I meant to say is "The fact that
Map.put (and List.set) returns a value is an implementation detail (with
respect to the endeavor at hand).
         Sorry for the confusion,

         Josh

2009/6/24 Joshua Bloch <jjb at google.com>

> I'm with Artur on this.  I think we're making a mountain out of a molehill.
>  The fact that  collection.put(value) is an implementation detail.  The
> value of (a = expr) is and should remain expr.
>                    Josh
>
> 2009/6/24 <abies at adres.pl>
>
>
>>
>> "Reinier Zwitserloot" <reinier at zwitserloot.com> napisał(a):
>>  > I am beginning to see some concensus on this list that the neal
>>  > semantics are the most preferred semantics. That is:
>>  >
>>  > FOO = (a[b] = c);
>>  >
>>  > should be equal to:
>>  >
>>  > a[b] = c;
>>  > FOO = a[b];
>>  >
>>  > and thus, both a setter and a getter call.
>>
>>
>> I still don't understand why. It is not a case with current assignment
>> operator.
>> public class Test {
>> volatile static int[] arr = new int[1];
>> volatile static int val = 0;
>> public static void main(String[] args) {
>>    int x,y;
>>    x = (val = 3);
>>    y = (arr[0] = 5);
>> }
>> }
>>
>>
>> compiles into
>>
>> public static void main(java.lang.String[]);
>>  Code:
>>   0:   iconst_3
>>   1:   dup
>>   2:   putstatic       #2; //Field val:I
>>   5:   istore_1
>>   6:   getstatic       #3; //Field arr:[I
>>   9:   iconst_0
>>   10:  iconst_5
>>   11:  dup_x2
>>   12:  iastore
>>   13:  istore_2
>>   14:  return
>>
>>
>> Please note that there is no get from the arr nor from val, even if both
>> are volatile and could be possible written into by another thread
>> concurrently.
>>
>> x = (y = z)
>>
>> IS NOT EQUAL TO
>>
>> y = z;
>> x = y;
>>
>> in current java.
>>
>> It is equal to
>>
>> tmp = z;
>> y = tmp;
>> x = tmp;
>>
>> I don't understand why suddenly for sugar-on-top-of-collections we have to
>> change the rules which are valid for normal values and arrays. There is no
>> 'getter' equivalent called for anything in java currently, if you will
>> modify jvm to catch retrieve-value-from-array, it will not be invoked, so
>> why should getter be called on collections?
>>
>> Regards,
>> Artur Biesiadowski
>>
>>
>



More information about the coin-dev mailing list