在java中,synchronized块中的返回值看起来像坏样式.真的有关系吗?

Cha*_*eed 49 synchronized-block

我有一个WeakReference的Collections.synchronizedList,_components;

我写了类似下面的内容,期待编译器抱怨:

public boolean addComponent2(Component e) {
    synchronized (_components) {
        return _components.add(new WeakReference<Component>(e));
    }        
}
Run Code Online (Sandbox Code Playgroud)

但编译器非常满意.请注意,List.add()返回TRUE.好吧,从synchronized块的任何退出都会释放锁,但是这个LOOK不是很奇怪吗?它有点像块中的"洞",类似于在循环中使用return.

你会很乐意维护这样的代码吗?

Jon*_*eet 60

它绝对没问题 - 从循环返回,或从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;
}
Run Code Online (Sandbox Code Playgroud)

  • @corsiKa:如果*需要更改,那么未来只会带来好处.如果它不是必需的,那么它会使*读取*代码在整个时间里变得有点困难,IMO. (5认同)

Mar*_*ers 45

synchronized块内返回没有错.锁定将被正确释放.