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

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

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

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

Но компилятор вполне устраивает. Обратите внимание, что List.add() возвращает TRUE. Итак, любой выход из синхронизированного блока снимает блокировку, но разве это не ВЫГЛЯДИТ странно? Это что-то вроде «дырки» в блоке, похожей на использование возврата в цикле.

Вы были бы счастливы поддерживать такой код?


person Charlweed    schedule 01.11.2011    source источник


Ответы (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;
}
person Jon Skeet    schedule 01.11.2011
comment
Хотя я обычно также возвращаюсь из блока (на самом деле, я все равно больше не использую примитивные блоки синхронизации, но все же), может быть некоторая польза от этого с самого начала. Если у вас есть только блок синхронизации, а позже нужно добавить какой-то дополнительный код, но этот код не требует синхронизации, то вы уже разбили его. Если он не сломан, будущие разработчики в спешке могут просто добавить дополнительный код внутри блока синхронизации, так как это проще, что может излишне загружать монитор. Так что я бы все равно вернул форму внутрь, но есть некоторая небольшая польза на будущее. - person corsiKa; 09.04.2013
comment
@corsiKa: в будущем есть только польза, если это изменение потребуется. Если это не требуется, то это делает чтение кода все время немного сложнее, IMO. - person Jon Skeet; 09.04.2013

Нет ничего плохого в возвращении внутрь блока synchronized. Блокировка будет разблокирована правильно.

person Mark Byers    schedule 01.11.2011