Использую такую логику:
return new AmigoSet<E>(map.keySet());
Валидатор не принимает. Для удовлетворения требований по исколючениям обернул это в try, но не помогает. Сравнил результаты своего метода и предлагаемого в качестве правильного решения (cloneOrig в коде ниже), результат вроде одинаковый - клонированый set хранит новую мапу в которой ссылки на исходные элементы (user в моем примере)
Чем плох мой вариант клонирования?
package com.javarush.task.task37.task3707;
import java.io.Serializable;
import java.sql.SQLOutput;
import java.util.*;
public class AmigoSet<E> extends AbstractCollection<E> implements Set<E>, Serializable, Cloneable {
private static final Object PRESENT = new Object();
private transient HashMap<E, Object> map;
public AmigoSet() {
map = new HashMap<E, Object>();
}
public AmigoSet(Collection<? extends E> collection) {
int capacity = (int) Math.ceil(collection.size()/.75f);
if (capacity < 16)
capacity = 16;
map = new HashMap<E, Object>(capacity);
this.addAll(collection);
}
@Override
public Iterator<E> iterator() {
return map.keySet().iterator();
}
@Override
public int size() {
return map.size();
}
public boolean add(E e) {
if (map.put(e, PRESENT) == null)
return true;
return false;
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public boolean contains(Object o) {
return map.keySet().contains(o);
}
@Override
public void clear() {
map.clear();
}
@Override
public boolean remove(Object o) {
return map.keySet().remove(o);
}
@Override
public Object clone() throws InternalError {
AmigoSet<E> newAmigo;
try {
newAmigo = new AmigoSet<E>(map.keySet());
}
catch (Exception e) {
throw new InternalError();
}
return newAmigo;
}
public Object cloneOrig() {
try {
AmigoSet<E> newSet = (AmigoSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (Exception e) {
throw new InternalError();
}
}
public static void main(String[] args) {
AmigoSet<User> amigo = new AmigoSet<>();
amigo.add(new User("Test"));
amigo.add(new User("Passed"));
System.out.println(amigo);
AmigoSet<User> amigo2 = (AmigoSet<User>) amigo.clone();
System.out.println(amigo2);
AmigoSet<User> amigo3 = (AmigoSet<User>) amigo.cloneOrig();
System.out.println(amigo3);
}
static class User {
String name;
public User(String name) {
this.name = name;
}
}
}