458 подписчиков
1243. Расскажите про клонирование объектов. Клонирование объектов в Java происходит с помощью метода Object.clone(). Этот метод создаёт и возвращает копию объекта. Класс объекта, который мы хотим клонировать, должен реализовать интерфейс Cloneable и переопределить метод clone(). Но есть некоторые особенности процесса клонирования в Java: Например, если у нас есть класс Person, то мы можем клонировать его так: public class Person implements Cloneable { private String name; private int age; ...
8 месяцев назад
458 подписчиков
Метод clone() в Java используется для создания копии объекта. При работе метода clone() с полями объекта типа-ссылки, происходит клонирование ссылок на объекты, на которые эти поля ссылаются. То есть, если у исходного объекта было поле типа-ссылки, которое ссылалось на другой объект, то у его клонированной копии будет также поле типа-ссылки, но уже с новой ссылкой, которая указывает на новый клонированный объект, а не на оригинальный объект. Важно понимать, что...
1 год назад
55 подписчиков
🖇 Создание глубокой и поверхностной копии объекта.
Java Stream API: когда использовать map() и FlatMap()

При работе с объектами в Java бывают случаи, когда вам необходимо создать копию объекта. Однако не все копии одинаковы. Существует два основных способа копирования объектов: глубокое копирование (Deep Copy) и поверхностное копирование (Shallow Copy).

Глубокое копирование: что это такое?
Представьте, что у вас есть коллекция фигур, каждая из которых имеет свой перечень свойств. Глубокая копия объекта означает создание совершенно новой копии исходного объекта вместе со всеми вложенными объектами, которые он содержит. Иными словами, это похоже на точную копию каждой формы, включая все детали.

Поверхностное копирование: в чем разница?
С другой стороны, поверхностное копирование создает копию объекта, не зная о структуре класса, который он копирует. То есть, объект копируется без содержащихся в нем вложенных объектов. По умолчанию в Java применяется поверхностное копирование. Для этого используется метод clone().

Давайте применим копирование на практике: пример фигур
Представьте, что у вас есть класс с именем Circle, в котором есть вложенный объект класса Point, представляющий его центр. Сейчас мы увидим, как глубокое и поверхностное копирование работают с этими объектами.

public class Circle {
public Point center;
public int radius;

public Circle(Point center, int radius) {
this.center = center;
this.radius = radius;
}
}

public class Point {
public int x, y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}
}

Создание поверхностной копии
Для поверхностного копирования мы просто копируем ссылки на вложенные объекты:

public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}

Создание глубокой копии
ля глубокой копии Circle нам нужно создать новые экземпляры объектов Point и Circle.

public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}

Создание простого класса CopyUtil
Вот класс утилиты с кодом копирования объектов:

public class CopyUtil {
public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}
public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}
}

Модульные тесты
Давайте напишем несколько простых тестов для проверки наших методов глубокого и поверхностного копирования.


9 месяцев назад