2010-08-30 42 views
11

Trong khi xem xét mã nguồn Java API, tôi thường thấy các tham số phương thức được gán lại cho các biến cục bộ. Tại sao điều này lại được thực hiện?Tại sao các tham số phương thức được gán lại cho các biến cục bộ?

void foo(Object bar) { 
    Object baz = bar; 
    //... 
} 

Đây là trong java.util.HashMap

public Collection<V> values() { 
    Collection<V> vs = values; 
    return (vs != null ? vs : (values = new Values())); 
} 
+6

Bạn vui lòng cho chúng tôi một vài phương pháp ví dụ để xem? – jjnguy

+1

Tôi nghĩ Doug Lea được biết là làm điều này trong gói 'đồng thời'? Có lẽ tôi đã sai, mặc dù (trong trường hợp tôi xin lỗi). Related/dupe: http://stackoverflow.com/questions/3080074/why-would-anyone-make-additional-local-variable-just-to-put-final-keyword-on-it và http: // stackoverflow. com/questions/2785964/in-arrayblockingqueue-why-copy-final-member-field-into-local-final-variable; OK, tôi đã nhận được nó hơi sai, nhưng Doug Lea làm điều gì đó tương tự với các biến cục bộ 'final'. – polygenelubricants

+0

Có thể trùng lặp của [Tại sao nó không sử dụng trường cá thể trực tiếp, nhưng gán nó cho một biến cục bộ?] (Https://stackoverflow.com/questions/7943763/why-it-doesnt-use-the-instance- field-directly-but-assigns-it-to-a-local-variab) – anacron

Trả lời

4

Đây là quy tắc an toàn luồng/hiệu suất tốt hơn. values trong HashMap dễ bay hơi. Nếu bạn đang gán biến cho biến cục bộ, nó sẽ trở thành biến ngăn xếp cục bộ tự động là luồng an toàn. Và nhiều hơn nữa, sửa đổi biến ngăn xếp cục bộ không bắt buộc 'xảy ra-trước' nên không có hình phạt đồng bộ hóa khi sử dụng nó (trái ngược với biến động khi mỗi lần đọc/ghi bạn sẽ có được/giải phóng khóa)

+0

Nhưng tham số phương thức cũng là biến ngăn xếp cục bộ. – EJP

+0

@EJP, @polygenelubricants. Nắm bắt tốt. Trong trường hợp này, tôi hoàn toàn đồng ý rằng phần câu hỏi này được đề cập trong http://stackoverflow.com/questions/2785964/in-arrayblockingqueue-why-copy-final-member-field-into-local-final-variable (giả sử rằng có bản sao cuối cùng không dành riêng cho việc sử dụng lớp bên trong) –

0

tôi sẽ phải xem xét một số ví dụ thực tế, nhưng lý do duy nhất tôi có thể nghĩ đến để làm điều này là nếu giá trị ban đầu cần được bảo quản cho một số tính toán ở cuối phương thức. Trong trường hợp này, việc khai báo một trong các "biến" final sẽ làm rõ điều này.

+0

Không, một số người làm điều này một cách tôn giáo. Không chắc chắn lý do tại sao. –

+0

Cuối cùng tôi đã tìm thấy những gì tôi đã thấy trước đây. Đây là trong bộ sưu tập công cộng java.util.HashMap giá trị() { Bộ sưu tập vs = giá trị; return (vs! = Null? Vs: (values ​​= new Values ​​())); } – initialZero

+0

@initialZero - đó là biến thành viên, thay vì tham số phương thức, được sao chép sang biến cục bộ. Điều này phổ biến hơn một chút, đặc biệt là trong các lớp được thiết kế để truy cập đồng thời bởi nhiều luồng. Tuy nhiên, 'HashMap' không phải là một lớp như vậy, vì vậy lý do duy nhất tôi có thể thấy là cho" hiệu suất "; đọc một địa phương nhanh hơn đọc một biến thành viên. Tuy nhiên, nó không phải là một sự khác biệt đủ lớn để biện minh cho mã obfuscating như thế này, và họ chỉ tiết kiệm một đọc, và thêm một biến địa phương viết, vì vậy tôi không chắc chắn nếu nó sẽ có bất kỳ lợi ích thực sự. – erickson

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