2012-03-10 13 views
5

Tendo ad utilizzare (o addirittura a utilizzare eccessivamente) l'intializzazione di oggetti con doppie parentesi in GWT. Per me sembra più leggibile e più dichiarativo.Quanto sono dannose le doppie parentesi in GWT?

new FastMap<Object>(){{ 
    put("Value", 12); 
    put("Unit", "Kg"); 
}}; 

Prima di oggi non ero consapevole del fatto che questa sintassi non è solo un'istanza di oggetto, ma anche a creare AnonymousInnerClass for it. Ora sono preoccupato di come GWT si occupa di loro.

  1. In che modo questa sintassi influenza la perfomance dell'esecuzione?
  2. In che modo questa sintassi influisce sulle dimensioni compilate?
  3. Qualsiasi altra cosa negativa?

Ho migliaia di tali inizializzazioni nella mia app.

+0

ottima domanda. Prova a compilare con _-style = PRETTY_, che potrebbe far luce. –

risposta

5

I miei risultati. Test code. Sto creando una singola lista con 4 mappe con 21 item ciascuna. Sto misurando le dimensioni di tutti i file JavaScript generati.Risultati:

vuoti (solo codice vuoto per assicurarsi che GWT codice di supporto rendering):

  • GRAZIOSA = 533 KB (546 602 byte)
  • OBF = 212 KB (217 601 bytes)
  • Numero di new = 167

Codice senza parentesi graffe doppie:

  • GRAZIOSA = 557 KB (570 682 byte)
  • OBF = 222 KB (227 663 bytes)
  • Numero di new = 171

E stesso codice con doppi ganci:

  • GRAZIOSA = 567 KB (581 004 byte)
  • OBF = 228 KB (234 089 bytes)
  • Numero di new = 177

penso che i risultati sono abbastanza auto-esplicativo.

+0

Wtg, inserendo effettivamente il lavoro. –

1

Per quanto riguarda la leggibilità è interessato: vorrei cambiare a qualcosa di simile per rendere più facile la lettura:

new FastMap<Object>() 
{{ 
    put("Value", 12); 
    put("Unit", "Kg"); 
}}; 

È tuttavia potrebbe desiderare di leggere this risposta a saperne di più sui problemi relativi alle prestazioni.

+1

Che non verrà compilato. Hai dimenticato la seconda serie di parentesi graffe. – Jeffrey

+0

Il mio male. Grazie! – beta

+1

Il collegamento fornito riguarda java, non GWT. In GWT compila il javascript senza oggetti. È possibile che in GWT non abbia effetti dannosi visibili. –

1

Se sei solo definire mappe costanti come questo, si sarebbe probabilmente essere meglio (sia la velocità-saggio e la leggibilità-saggio) utilizzando Guava e ImmutableMap:

Map<Integer, Character> map = ImmutableMap.of(5, 'a', 1, 'b'); 
Map<Integer, String> largerMap = ImmutableMap.<Integer, String>builder() 
    .put(1, "a") 
    .put(2, "b"); 
    .put(5, "wisconsin") 
    .build(); 

(Sono da Google , e sono totalmente compatibili con GWT.)

+0

Beh, la domanda riguarda qualsiasi classe. In realtà nella maggior parte dei casi questo è il mio calibro DSL interno. Grazie per i link su Guava e ImmutableMap. Sembra promettente. –

2

Questo è Java standard ed è indipendente da GWT. È trattato in modo completo in Efficiency of Java “Double Brace Initialization”?.

Il problema più grande che ho con questa sintassi è che non fornisce un'istanza di FastMap, ma piuttosto di una sottoclasse anonima di quello. Tale oggetto non viene confrontato con uguale a in un'istanza equivalente di FastMap con i dati impostati in modo tradizionale. È anche probabile che abbia altri trucchi che non sono ovvi e che sono meno facili da eseguire per il debug.


Il filo here dice questo

stare attenti - inizializzazione doppio tutore è fresco guardando, ma è ordini di grandezza più lenta di inizializzazione regolare come deve generare una classe anonima.

Inoltre, la classe generata viene inserita nello spazio permgen, che non è spazzatura raccolta . Per impostazione predefinita, il permgen è piuttosto piccolo e se lo si sostituisce con il numero , il sistema viene protetto.

Io li uso sempre in test di unità, ma mai nel codice di produzione.

+2

Ma GWT non è solo un'altra API Java, ma piuttosto una "DSL" (non proprio, ma umorismo) che sembra essere Java e compila in Javascript sul lato client. Quel processo potrebbe gestire DBI diverso dal compilatore Java e JVM di runtime gestirlo. –

+0

D'accordo con Kevin. –

+0

@Kevin: ho appena capito cosa significa * DBI * oltre all'interfaccia database! Sì, sono d'accordo anche con te Sarebbe semplice per qualcuno controllare quali poche righe di Java si compongono. – Borodin

Problemi correlati