В Java возвращаемое значение в синхронизированном блоке кажется плохим стилем. Это действительно имеет значение?

У меня есть Collections.synchronizedList WeakReference, _components;

Я написал что-то вроде следующего, ожидая, что компилятор пожалуется:

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

Но компилятор вполне устраивает. Обратите внимание, что List.add() возвращает TRUE. Итак, любой выход из синхронизированного блока снимает блокировку, но не выглядит ли это странно? Это похоже на "дыру" в блоке, похожую на использование return в цикле.

Будете ли вы счастливы, поддерживая такой код?

2 ответа

Решение

Это абсолютно нормально - как возвращается из цикла или из try блок, который имеет соответствующий finally блок. Вам просто нужно знать семантику, и в этот момент она имеет смысл.

Это, конечно, более простой код, чем введение локальной переменной ради этого:

// 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;
}

Нет ничего плохого в том, чтобы вернуться внутрь synchronized блок. Замок будет снят правильно.

Другие вопросы по тегам