Вывод:
com.javarush.task.task21.task2107.Solution@292d
com.javarush.task.task21.task2107.Solution@292d
{Hubert=com.javarush.task.task21.task2107.Solution$User@817bd907, Zapp=com.javarush.task.task21.task2107.Solution$User@2a6c3f}
{Hubert=com.javarush.task.task21.task2107.Solution$User@817bd907, Zapp=com.javarush.task.task21.task2107.Solution$User@2a6c3f}
Process finished with exit code 0
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 static Map<String, User> users = new LinkedHashMap();
@Override
protected Solution clone() throws CloneNotSupportedException {
Solution solution = new Solution();
for(Map.Entry<String, User> user : this.users.entrySet())
solution.users.put(user.getKey(), (User)user.getValue().clone());
return solution;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Solution)) return false;
Solution solution = (Solution) o;
return Objects.equals(users, solution.users);
}
@Override
public int hashCode() {
return users != null ? users.hashCode() : 0;
}
public static class User implements Cloneable{
int age;
String name;
@Override
protected User clone() throws CloneNotSupportedException{
return (User) super.clone();
}
@Override
public boolean equals(Object o) {
if(o == null) return false;
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
public User(int age, String name) {
this.age = age;
this.name = name;
}
}
}