2011-11-01 17 views
44

Tôi có một Collections.synchronizedList của WeakReference, _components;Trong java, giá trị trả về trong khối đồng bộ có vẻ giống như kiểu xấu. Thật sự nó có ảnh hưởng sao?

tôi đã viết một cái gì đó như sau, mong các trình biên dịch để phàn nàn:

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

Nhưng trình biên dịch là hoàn toàn hài lòng. Lưu ý rằng List.add() trả về TRUE. Vì vậy, ok, bất kỳ lối ra từ một khối đồng bộ phát hành khóa, nhưng điều này không lạ? Nó giống như một "lỗ hổng" trong khối, tương tự như sử dụng trở lại trong một vòng lặp.

Bạn có hài lòng khi duy trì mã như thế này không?

Trả lời

52

Hoàn toàn ổn - khi đang trở về từ vòng lặp hoặc từ khối try có khối finally thích hợp. Bạn chỉ cần nhận thức được ngữ nghĩa, tại thời điểm đó nó có ý nghĩa hoàn hảo.

Đó chắc chắn đoạn code đơn giản hơn so với việc giới thiệu một biến địa phương vì lợi ích của nó:

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

Trong khi tôi thường trở về từ bên trong khối quá (trên thực tế, tôi không thấy mình sử dụng các khối đồng bộ nguyên thủy nữa nhiều anyway , nhưng vẫn còn) có thể có một số lợi ích trong việc này từ đầu. Nếu bạn chỉ có khối đồng bộ, và sau đó một số mã bổ sung phải được thêm vào nhưng mã đó không yêu cầu đồng bộ hóa, thì bạn đã có nó bị hỏng. Nếu nó không bị hỏng, các nhà phát triển tương lai vội vàng có thể chỉ cần thêm mã phụ bên trong khối đồng bộ vì nó dễ dàng hơn, điều này có thể buộc màn hình không cần thiết. Vì vậy, tôi vẫn sẽ trở lại hình thức bên trong, nhưng có một số lợi ích nhỏ cho tương lai. – corsiKa

+3

@corsiKa: Chỉ có lợi cho tương lai * nếu * thay đổi đó là bắt buộc. Nếu nó không được yêu cầu, sau đó nó làm cho * đọc * mã mà khó hơn một chút trong toàn bộ thời gian, IMO. –

38

Không có gì sai khi trả lại bên trong khối synchronized. Khóa sẽ được phát hành chính xác.

Các vấn đề liên quan