Я наконец понял очень простую вещь, чтобы не путаться.
• Примитивы — клонируются автоматически.
• Immutable объекты (неизменяемые) — просто копируем.
Для массивов Immutable объектов достаточно вызвать .clone() на массиве.
• Mutable объекты (изменяемые) или массивы Mutable объектво — делаем глубокое клонирование (создание нового объекта и копирование содержимого через цикл).
Как раз и навсегда запомнить, что есть Immutable, а что Mutable?
// Immputable — чтобы изменить значение поля, необходимо выполнить присвоение нового значения
String string = "Hello";
string.toUpperCase; // у поля string ничего не изменилось
string = string.toUpperCase; // присвоили полю string новую строку "HELLO"
// Mutable — можно вызывать метод, который изменяет само значение
ArrayList<String> original = new ArrayList<>();
original.add("A");
ArrayList<String> сopy = original;
original.add("B"); // меняем original
System.out.println(original); // [A, B]
System.out.println(copy); // [A, B] — copy тоже изменился
P.S. нет, это не нейросеть, у меня Alt + 0151 на автопилоте после четырёх лет курсачей и дипломной работы
что не так с первой задачей не проходит по последнему условию с пометкой "При клонировании должен быть создан новый объект, а не возвращен текущий."
public class Solution implements Cloneable{
@Override
protected Solution clone() throws CloneNotSupportedException {
Solution solutionClone = (Solution) super.clone();
HashMap<String, User> clonedMap = new LinkedHashMap<>();
solutionClone.users = clonedMap;
for (Map.Entry<String, User> entry : users.entrySet()) {
String s = entry.getKey();
User u = entry.getValue();
User userClone = u.clone();
solutionClone.users.put(s, userClone);
}
return solutionClone;
}
protected HashMap<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
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
protected User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
}
Задачи достаточно интересные на закрепление изученного материала, только вот... Материал я изучал на сторонних сайтах и с помощью ИИ. К сожалению, после оригинальной лекции мало что отложилось в голове. С другой стороны меня такой подход вполне устраивает, что JavaRush даёт вектор по которому ты движешься, а остальное учишься искать сам, что не маловажно в этой профессии. И я всегда задумываюсь над тем, что после окончания курса нам даже направление никто показывать не будет и что тогда? И опять же, я купил этот курс под новый год тысяч за 6,5 рублей, что это сейчас за сумма? Совсем ничего за такой огромный объем задач и такое прекрасное комьюнити, которое все объяснит и поддержит. Так что мой совет тем, кто ничего не понимает, откройте глаза и поймите уже, что в этой суровой жизни никто ничего объяснять не будет. В том-то и задумка учиться разбираться во всём самому. Спасибо JavaRush!
Я сейчас на 40-м уровне и скажу вам, что наступил тот момент, когда ты прикоснулся к многим темам, много чего изучил, прочитал, решил задач, и чем больше знаний, тем больше осознание того, что я совсем ничего не понимаю. Курс сейчас - это 20%, а то и меньше, остальное - полностью самостоятельное изучение
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ