Indexing access for Lists and Maps considered harmful?
    Ted Neward 
    ted at tedneward.com
       
    Wed Jun 24 00:48:50 PDT 2009
    
    
  
Um.. I guess I assume that the getter would work as expected. I don't really
care what the underlying code generated looks like, so long as the language
semantics are upheld. Frankly, if the compiler wants to turn this:
 
list[0] = list[1] = "hello";
 
into:
 
T temp = "hello";
list.indexSet(1, temp);
list.indexSet(0, temp);
 
as opposed to:
 
list.indexSet(1, "hello");
list.indexSet(0, list.indexGet(1));
 
on the grounds that the first version would be moderately faster, I could
really care less. That's an implementation detail. 
 
The goal of any language enhancement should be to preserve existing language
semantics even as it extends them.
 
Ted Neward | Principal Consultant, ThoughtWorks
Java, .NET, XML Services
Consulting, Teaching, Speaking, Writing
http://www.thoughtworks.com <http://www.tedneward.com>  |
http://www.tedneward.com
 
 
From: spamolovko [mailto:spamolovko at gmail.com] 
Sent: Wednesday, June 24, 2009 12:33 AM
To: Ted Neward
Cc: 'Reinier Zwitserloot'; coin-dev at openjdk.java.net
Subject: Re: Indexing access for Lists and Maps considered harmful?
 
How must work "list[0] = list[1];"?
 
this must work as:
list.indexSet(0, list.indexGet(1));
 
 
So 
list[0] = list[1] = "hello";
must work same as semantically identical
list[1] = "hello";
list[0] = list[1];
 
This mean that it would be translated into:
list.indexSet(1, "hello");
list.indexSet(0, list.indexGet(1));
 
Why are you forgetting about GETTER? If you get anything from collection -
you MUST use getter, not result from setter. That is JavaBeans semantic.
 
 
PS do not use setter instead of getter and all will work fine.
 
Ted Neward wrote: 
public interface IndexedAccess<ValueType> {
 
    public ValueType indexGet(int key);
 
    public void indexSet(int key, ValueType value);
 
}
 
interface Collection<E> extends Iterable<E>, IndexedAccess<E>
 
and then just use:
List<String> list = new ...
list[0] = "hello";
 
What is the problems here?
 
    
For starters, assuming your implementation turns
 
list[0] = "hello";
 
into
 
list.indexSet(0, "hello");
 
which returns void, then the following
 
list[0] = list[1] = "hello";
 
would fail:
 
list.indexSet(0, list.indexSet(1, "hello"));
  // error! Cannot pass void as a parameter
 
And that would break the existing Java semantics that have been there since
1.0.
 
In your implementation, indexSet *must* return ValueType, and it must return
the value passed in, if the existing semantics for Java are going to be
preserved. Am I missing something here? If, as I think Neal already pointed
out, we look at the expression
 
a = b = c;
 
The results of the intermediate expression "b = c" is "c", and therefore the
results of the expression "a = (b = c)" is "c" as well. What are we arguing
about? This is established Java language semantics, isn't it?
 
Ted Neward | Principal Consultant, ThoughtWorks
Java, .NET, XML Services
Consulting, Teaching, Speaking, Writing
http://www.thoughtworks.com | http://www.tedneward.com
    
    
More information about the coin-dev
mailing list