Конструкторы копирования и защитное копирование

Что такое конструктор копирования?

Может ли кто-нибудь поделиться небольшим примером, который может быть полезен для понимания наряду с защитным принципом копирования?

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;  
   }  
.
.
. 
}

Связанный с защитной копией здесь - хорошее чтение

Другие вопросы по тегам