Конструкторы копирования и защитное копирование
Что такое конструктор копирования?
Может ли кто-нибудь поделиться небольшим примером, который может быть полезен для понимания наряду с защитным принципом копирования?
5 ответов
Вот хороший пример:
class Point {
final int x;
final int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
Point(Point p) {
this(p.x, p.y);
}
}
Обратите внимание, как конструктор Point(Point p)
занимает Point
и делает копию - это copy constructor
,
Это defensive
копировать, потому что оригинал Point
защищен от изменений, взяв его копию.
А сейчас:
// A simple point.
Point p1 = new Point(3,42);
// A new point at the same place as p1 but a completely different object.
Point p2 = new Point(p1);
Обратите внимание, что это не обязательно правильный способ создания объектов. Это, однако, хороший способ создания объектов, который гарантирует, что у вас никогда не будет двух ссылок на один и тот же объект случайно. Понятно, что это хорошо, только если это то, чего вы хотите достичь.
Конструкторы копирования, которые часто можно увидеть в C++, где они необходимы для частично скрытых, автоматически вызываемых операций.
java java.awt.Point
а также Rectangle
приходит на ум; также очень старые, изменчивые объекты.
Используя неизменяемые объекты, такие как String
, или же BigDecimal
, просто присвоение ссылки на объект будет делать. Фактически, из-за ранней фазы Java после C++, в String все еще есть глупый конструктор копирования:
public class Recipe {
List<Ingredient> ingredients;
public Recipe() {
ingredients = new ArrayList<Ingredient>();
}
/** Copy constructor */
public Recipe(Recipe other) {
// Not sharing: ingredients = other.ingredients;
ingredients = new ArrayList<Ingredient>();
ingredients.addAll(other.ingredients);
}
public List<Ingredient> getIngredients() {
// Defensive copy, so others cannot change this instance.
return new ArrayList<Ingredient>(ingredients);
// Often could do:
// return Collections.immutableList(ingredients);
}
}
Конструктор копирования в Java может быть использован, когда вам нужно клонировать объект
class Copy {
int a;
int b;
public Copy(Copy c1) {
a=c1.a;
b=c1.b;
}
}
В Java, когда вы даете копию c2=c1
; просто создает ссылку на исходный объект, а не копию, поэтому вам нужно вручную скопировать значения объекта.
Видеть это:
Здесь вы создаете новый объект, передавая старый объект, копируя его значения.
Color copiedColor = new Color(oldColor);
вместо:
Color copiedColor = new Color(oldColor.getRed(),
oldColor.getGreen(), oldColor.getBlue());
Конструктор копирования используется для создания нового объекта, используя значения существующего объекта.
Одним из возможных вариантов использования является защита исходного объекта от изменения, в то время как скопированный объект можно использовать для работы.
public class Person
{
private String name;
private int age;
private int height;
/**
* Copy constructor which creates a Person object identical to p.
*/
public person(Person p)
{
person = p.person;
age = p.age;
height = p.height;
}
.
.
.
}
Связанный с защитной копией здесь - хорошее чтение