2011-11-01 11 views
44

Ho una Collections.synchronizedList di WeakReference, _components;In java, il valore restituito all'interno del blocco sincronizzato sembra un cattivo stile. Importa davvero?

ho scritto qualcosa di simile a quanto segue, aspettandosi il compilatore a lamentarsi:

public boolean addComponent2(Component e) { 
    synchronized (_components) { 
     return _components.add(new WeakReference<Component>(e)); 
    }   
} 

Ma il compilatore è perfettamente soddisfatto. Notare che List.add() restituisce VERO. Quindi ok, qualsiasi uscita da un blocco sincronizzato rilascia il blocco, ma questo non sembra strano? È un po 'come un "buco" nel blocco, simile all'utilizzo del ritorno in loop.

Sarebbe felice mantenere il codice come questo?

risposta

52

È assolutamente soddisfacente, come il ritorno da un loop o da un blocco try con un blocco finally appropriato. Devi solo essere consapevole della semantica, a quel punto ha perfettamente senso.

E 'certamente il codice più semplice di introdurre una variabile locale per il gusto di farlo:

// Ick - method body is now more complicated, with no benefit 
public boolean addComponent2(Component e) { 
    boolean ret; 
    synchronized (_components) { 
     ret = _components.add(new WeakReference<Component>(e)); 
    } 
    return ret; 
} 
+1

Mentre io di solito ritorno da dentro il blocco di troppo (in realtà, non mi trovo con blocchi di sincronizzazione primitive più molto comunque , ma ancora) ci possono essere alcuni vantaggi nel fare questo fin dall'inizio. Se si dispone solo del blocco di sincronizzazione e in seguito è necessario aggiungere un codice aggiuntivo, ma il codice non richiede la sincronizzazione, quindi è già stato risolto. Se non è stato risolto, gli sviluppatori futuri potrebbero aggiungere il codice aggiuntivo all'interno del blocco di sincronizzazione poiché è più semplice, il che potrebbe legare il monitor inutilmente. Quindi vorrei ancora restituire la forma all'interno, ma c'è un piccolo vantaggio per il futuro. – corsiKa

+3

@ corsiKa: C'è solo un vantaggio per il futuro * se * tale modifica è richiesta. Se non è richiesto, rende * leggendo * il codice un po 'più difficile per tutto il tempo, IMO. –

38

Non c'è niente di sbagliato nel tornare all'interno di un blocco synchronized. Il blocco verrà rilasciato correttamente.