Ответ 1
Чтобы немного расширить ответ Майкла, я ожидаю, что он должен гарантировать, что метод keySet()
никогда не вернет null
, возможно, помимо того, что будет отмечен рейтинг производительности.
С учетом этого кода:
public Set<K> keySet() {
return (keySet == null ? (keySet = new KeySet()) : keySet;
}
Было бы, по крайней мере, теоретически возможным в многопоточном коде, что поле keySet
может быть установлено в null
между первым чтением (keySet == null
) и вторым чтением, где оно возвращается. Я не смотрел остальную часть кода, но я предполагаю, что есть другие места, где keySet
потенциально назначается null
. Является ли это результатом проблемы, замеченной в дикой природе, или защитная мера была бы вопросом для авторов.
Фактический код:
public Set<K> keySet() {
Set<K> ks;
return (ks = keySet) == null ? (keySet = new KeySet()) : ks;
}
... не имеет этой проблемы, поскольку поле читается только раз.