Зачем в конструкторе класса метод clone()?
Необходимо создать коллекцию, которая будет безопасно работать в многопоточной программе и будет являться общим ресурсом для потоков.
Не совсем понимаю, зачем нужен метод clone() в конструкторе класса и где здесь паттерн Декоратор.
Есть предположение, что таким образом избавляются от общего ресурса и каждый поток будет работать со своей локальной копией.
public class SingleLockList<T> implements Iterable<T> {
private final List<T> list;
public SingleLockList(List<T> list) {
this.list = (List) list.clone();
}
public void add(T value) {
}
public T get(int index) {
return null;
}
@Override
public Iterator<T> iterator() {
return null;
}
}
Ответы (1 шт):
Если ваш класс будет содержать ссылку на объект переданный извне, то он не может полностью контролировать к нему доступ. В этом случае клиент этого класса может сохранить список, который он использовал для создания SingleLockList, у себя и использовать его для модификации и доступа.
Это позволит клиенту обходить всю логику синхронизации и ограничения совместного доступа к списку реализованную в SingleLockList. Чтоб этого не происходило ваш класс не может хранить ссылки на разделяемые ресурсы, а это значит должен делать копии при получении объектов и также, когда возвращает объекты (например, если есть метод типа getList(), то он тоже должен возвращать копию, а не оригинальный list.