2015-08-03 7 views
5

Dane:Java tłumaczenie porywające operatora spread

class Car { 
    String make 
    String model 
} 
def cars = [ 
     new Car(make: 'Peugeot', model: '508'), 
     new Car(make: 'Renault', model: 'Clio')]  

def makes = cars*.make 

Jak cars*.make prace za sceną w Java? Czy tworzy nowy obiekt Map w stercie i łączy dwie mapy?

Odpowiedz

4

Przyjrzałem się kodowi bajtowemu, a jedynymi mapami są mapy tworzone w celu zainicjowania obiektów Car.

Po zainicjowaniu dwóch obiektów samochodu, zostaną one umieszczone na liście. Operator spreadu tłumaczy (w tym przypadku) połączenie na ScriptBytecodeAdapter.getPropertySpreadSafe.

Patrząc na źródło tej metody, zobaczysz, że w zasadzie tylko tworzy nowy ArrayList i dodaje żądanej właściwości (w tym przypadku make) każdego obiektu:

public static Object More ...getPropertySpreadSafe(Class senderClass, Object receiver, String messageName) throws Throwable { 
    if (receiver == null) return null; 

    List answer = new ArrayList(); 
    for (Iterator it = InvokerHelper.asIterator(receiver); it.hasNext();) { 
     answer.add(getPropertySafe(senderClass, it.next(), messageName)); 
    } 
    return answer; 
}