Это должно быть довольно распространенным явлением, когда у меня есть карта, и я хочу поточно выставить свой набор ключей:
public MyClass {
Map<String,String> map = // ...
public final Set<String> keys() {
// returns key set
}
}
Теперь, если моя "карта" не является поточно-ориентированной, это небезопасно:
public final Set<String> keys() {
return map.keySet();
}
А также нет:
public final Set<String> keys() {
return Collections.unmodifiableSet(map.keySet());
}
Итак, мне нужно создать копию, например:
public final Set<String> keys() {
return new HashSet(map.keySet());
}
Однако это тоже не кажется безопасным, потому что этот конструктор обходит элементы параметра и добавляет их к ним (). Поэтому во время этого копирования может возникнуть исключение ConcurrentModificationException.
Итак:
public final Set<String> keys() {
synchronized(map) {
return new HashSet(map.keySet());
}
}
похоже на решение. Это выглядит правильно?