2011-05-19 9 views
18

W this video from Google IO 2009 prezenter bardzo szybko stwierdza, że ​​sygnatury metod powinny zwracać konkretne typy zamiast interfejsów.W GWT, dlaczego metoda nie powinna zwracać interfejsu?

Z tego, co usłyszałem na wideo, ma to coś wspólnego z kompilatorem Java na kod JavaScript GWT.

  • Jaki jest powód tego wyboru?
  • Co robi interfejs w metodzie podpisu do kompilatora?
  • Jakie metody mogą zwracać interfejsy zamiast konkretnych typów, a które lepiej zwracają konkretne wystąpienia?

Snippet of code from Google IO presentation showing it's better that your method returns ArrayList than List

+0

Ma to związek z serializacją RPC. Zobacz http://stackoverflow.com/questions/3059787/gwt-using-listserializable-in-a-rpc-call –

+0

Zobacz lub tuż po 7-minutowym punkcie prezentacji. Mówiący nie wie dokładnie, dlaczego to robi.Nazywa to "przesądem". –

Odpowiedz

16

ten ma do czynienia z GWT-kompilatora, jak mówisz poprawnie. EDYCJA: Jednak, jak zauważył Daniel w komentarzu poniżej, nie dotyczy to ogólnie kompilatora gwt, ale tylko przy użyciu GWT-RPC.

Jeśli zadeklarujesz List zamiast ArrayList jako typ zwracany, to kompilator gwt będzie zawierał kompletną hierarchię List (tj. Wszystkie typy Lista wykonawcza) w skompilowanym kodzie. Jeśli użyjesz ArrayList, kompilator będzie musiał tylko uwzględnić hierarchię ArrayList (tj. Wszystkie typy implementujące ArrayList - która zwykle jest samą ArrayList). Za pomocą interfejsu zamiast konkretnej klasy zapłacisz karę w postaci czasu kompilacji i rozmiaru generowanego kodu (a tym samym ilość kodu, który każdy użytkownik musi pobrać podczas działania aplikacji).

Pytałeś także o przyczynę: jeśli używasz interfejsu (zamiast konkretnej klasy), kompilator nie wie, w czasie kompilacji, które implementacje tych interfejsów będą używane. Tym samym obejmuje wszystkie możliwe implementacje.

Odnośnie ostatniego pytania: wszystkie metody mogą zostać zadeklarowane, aby zwrócić interfejs (tak jest, prawda?). Powyższa kara obowiązuje.

A przy okazji: Jak rozumiem, problem ten nie ogranicza się do metod. Ma zastosowanie do wszystkich deklaracji typów: zmiennych, parametrów. Za każdym razem, gdy użyjesz interfejsu do zadeklarowania czegoś, kompilator będzie zawierał pełną hierarchię pod-interfejsów i klas implementujących. (Tak więc, jeśli zadeklarujesz swój własny interfejs tylko z jedną lub dwiema klasami implementacji, to nie poniesiesz dużej kary. W ten sposób używam interfejsów w GWT.)

W skrócie: używaj klas konkretnych, gdy tylko jest to możliwe. (. Mała sugestia: byłoby pomocne, jeśli dał się znacznik czasu, kiedy odnosi się do filmu)

+7

Przyrost kodu dotyczy tylko klas używanych do generowania kodu (na przykład GWT-RPC). Generalnie kompilator NIE rozrasta się przy użyciu interfejsów –

+0

** Daniel, masz rację! ** Całkowicie zapomniałem, że można używać GWT bez GWT-RPC. – Stefan

+0

@danielkurka - Czy wiesz, czy ten problem z interfejsem GWT-RPC nadal występuje w nowszych wersjach GWT? –

2

Te i inne porady dotyczące wydajności zostały zaprezentowane na konferencji Google IO 2011 - High-performance GWT.

Mniej więcej w tym punkcie 7 min mówić adresy „RPC Type Explosion”: #4 Watch out for RPC type explosion

Z jakiegoś powodu myślałam kompilator GWT by zoptymalizować go z dala ponownie, ale wydaje się, że jestem w błędzie.

+0

Czy to nadal dotyczy wersji 2.8.0? – displayname

Powiązane problemy