Để mở rộng một chút về Câu trả lời của Michael, tôi hy vọng nó có đó để đảm bảo rằng phương pháp keySet()
không bao giờ trả về null
, có thể ngoài việc cung cấp các lợi ích hiệu suất được ghi nhận.
Với mã này:
public Set<K> keySet() {
return (keySet == null ? (keySet = new KeySet()) : keySet;
}
Nó sẽ là ít nhất về mặt lý thuyết có thể trong đa luồng mã mà lĩnh vực keySet
có thể được thiết lập để null
giữa đọc đầu tiên (keySet == null
) và đọc thứ hai, nơi nó Được trả lại. Tôi đã không nhìn vào phần còn lại của mã, nhưng tôi giả sử có những nơi khác mà keySet
có khả năng được giao null
. Cho dù đây là kết quả của một vấn đề nhìn thấy trong tự nhiên, hoặc biện pháp phòng thủ sẽ là một câu hỏi cho các tác giả.
Mã thực tế:
public Set<K> keySet() {
Set<K> ks;
return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
}
... không có vấn đề này như lĩnh vực này chỉ được đọc một lần.
Có thể; mặc dù nó cũng có vẻ như anh ta đang cố gắng thiết lập một biến cấp lớp trong khi đảm bảo rằng biến không phải là null và trả về giá trị đó. Tôi đã không phải là một đầu mối vượt ra ngoài mặc dù. Tôi cần phải xem cả lớp. –
Có lẽ để hiểu rõ ý định – alphablue
Có thể được coi là bản sao của http://stackoverflow.com/q/28975415/3182664 http://stackoverflow.com/q/2785964/3182664 http://stackoverflow.com/q/ 37776179/3182664 http://stackoverflow.com/q/32619269/3182664 và có khả năng một số người khác ... – Marco13