web-dev-qa-db-fra.com

En Java, la valeur de retour dans le bloc synchronisé semble être un mauvais style. Est-ce que c'est vraiment important?

J'ai un Collections.synchronizedList de WeakReference, _components;

J'ai écrit quelque chose comme ceci, en m'attendant à ce que le plaignant se plaigne:

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

Mais le compilateur est parfaitement satisfait. Notez que List.add () renvoie VRAI. Donc ok, toute sortie d'un bloc synchronisé libère le verrou, mais cela ne vous semble-t-il pas étrange? C'est un peu comme un "trou" dans le bloc, semblable à l'utilisation du retour dans une boucle.

Seriez-vous heureux de maintenir un code comme celui-ci?

51
Charlweed

C'est tout à fait correct - tout comme le retour d'une boucle ou d'un bloc try qui a un bloc finally approprié. Vous avez juste besoin d'être conscient de la sémantique, à quel point cela a un sens parfait.

C'est certainement du code plus simple que d'introduire une variable locale pour le plaisir:

// 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;
}
58
Jon Skeet

Il n'y a rien de mal à retourner à l'intérieur d'un bloc synchronized. Le verrou sera libéré correctement.

44
Mark Byers