Добрый день.
Валидатор говорит, что методы clone() в классах User, Solution возвращают не новый объект, а текущий. Но ведь это не так, ибо в методах clone() создаются новые объекты. Подскажите, в чём тут дело?
Условия задачи:
Обеспечь возможность клонирования объекта класса Solution используя глубокое клонирование.
Данные в карте users также должны быть клонированы.
Не забудь о методах equals и hashCode для корректного добавления элементов типа User в HashMap.
Требования:
1. Класс Solution должен поддерживать интерфейс Cloneable.
2. Класс User должен поддерживать интерфейс Cloneable.
3. В классе User должен быть корректно реализован метод clone.
4. В классе Solution должен быть корректно реализован метод clone.
package com.javarush.task.task21.task2107;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
/*
Глубокое клонирование карты
*/
public class Solution implements Cloneable {
public static void main(String[] args) {
Solution solution = new Solution();
solution.users.put("Hubert", new User(172, "Hubert"));
solution.users.put("Zapp", new User(41, "Zapp"));
Solution clone = null;
try {
clone = (Solution) solution.clone();
System.out.println(solution);
System.out.println(clone);
System.out.println(solution.users);
System.out.println(clone.users);
} catch (CloneNotSupportedException e) {
e.printStackTrace(System.err);
}
}
protected Map<String, User> users = new LinkedHashMap();
public static class User implements Cloneable {
int age;
String name;
public User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return new User(this.age, this.name);
}
@Override
public int hashCode() {
if (name == null) return age;
else return age + name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof User)) return false;
return Objects.equals(this.age, ((User) obj).age) && Objects.equals(this.name, ((User) obj).name);
}
}
@Override
protected Object clone() throws CloneNotSupportedException {
Solution solution = new Solution();
solution.users = new LinkedHashMap<>(this.users);
return solution;
}
@Override
public int hashCode() {
if (users == null) return 0;
else return users.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Solution)) return false;
return Objects.equals(this.users, ((Solution) obj).users);
}
}
package com.javarush.task.task21.task2107;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
/*
Глубокое клонирование карты
*/
public class Solution implements Cloneable {
public static void main(String[] args) {
Solution solution = new Solution();
solution.users.put("Hubert", new User(172, "Hubert"));
solution.users.put("Zapp", new User(41, "Zapp"));
Solution clone = null;
try {
clone = (Solution) solution.clone();
System.out.println(solution);
System.out.println(clone);
System.out.println(solution.users);
System.out.println(clone.users);
} catch (CloneNotSupportedException e) {
e.printStackTrace(System.err);
}
}
protected Map<String, User> users = new LinkedHashMap();
public static class User implements Cloneable {
int age;
String name;
public User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return new User(this.age, this.name);
}
@Override
public int hashCode() {
if (name == null) return age;
else return age + name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof User)) return false;
return Objects.equals(this.age, ((User) obj).age) && Objects.equals(this.name, ((User) obj).name);
}
}
@Override
protected Object clone() throws CloneNotSupportedException {
Solution solution = new Solution();
solution.users = new LinkedHashMap<>(this.users.size());
solution.users.putAll(this.users);
return solution;
}
@Override
public int hashCode() {
if (users == null) return 0;
else return users.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Solution)) return false;
return Objects.equals(this.users, ((Solution) obj).users);
}
}